2017-02-03 47 views
1

我有一個Animal基類,每個子類都需要一個靜態字符串ID用於標識目的。從基類訪問子類的靜態常量

所以我可能有:

public class Dog : Animal { 
    public static readonly string ID = "dog"; 
} 

我這樣做是因爲我經常需要使用Dog.ID在我的應用程序 - 在地方,我還沒有一個實例。

不過,我也需要訪問這個時候我有一個實例,但我只希望把類似GetId()在基類:

public class Animal { 
    public string GetId() { 
    return ID; 
    } 
} 

的問題是,Animal不會有訪問孩子中的靜態ID字段。

有沒有辦法做到這一點,我忽略了?

回答

-2

沒有反向繼承。如果您需要訪問父類的ID,則需要將其設置在父類上。問題是說你也有這個:

public class Cat : Animal { 
    public static readonly string ID = "cat"; 
} 

哪個孩子會父母訪問?

1

醜...但是你可以使用反射:

FieldInfo id = GetType().GetField("ID", BindingFlags.Public | BindingFlags.Static); 
return id.GetValue(null); 
3

什麼抽象方法?

public class Dog : Animal 
{ 
    public static readonly string ID = "dog"; 
    public override string GetId() 
    { 
     return ID; 
    } 
} 

public abstract class Animal 
{ 
    public abstract string GetId(); 
} 

或虛擬

public class Animal 
{ 
    public virtual string GetId() 
    { 
     return null; 
    } 
} 
0

或者,你可以做這樣的事情:

public class Animal 
{ 
    public static string Id; 

    public virtual string GetId() 
    { 
     return Id; 
    } 
} 

public class Dog : Animal 
{ 
    public new static readonly string Id = "dog"; 

    public override string GetId() 
    { 
     return Id; 
    } 
} 

這使您能夠從類或實例呼叫ID的能力。

1

如果這是一個靜態的,設置一次標識符,好像你應該使用屬性,而不是一個static字段或屬性:

public class AnimalIdAttribute : Attribute 
{ 
    public AnimalIdAttribute(string id) 
    { 
      Id = id; 
    } 

    public string Id { get; } 
} 

public class Animal 
{ 
    public string Id => this.GetCustomAttribute<AnimalIdAttribute>(true)?.Id; 
} 

[AnimalId("dog")] 
public class Dog : Animal 
{ 
} 

而且,如果所有的動物應該提供一個Id,您Animal類應該是一個abstract類也應該定義一個抽象Id屬性:

public abstract class Animal 
{ 
    // Now you can access Id property implementation 
    // from Animal 
    public abstract string Id { get; } 
} 

public class Dog : Animal 
{ 
    public override string Id { get; } = "dog"; 
} 
0

如果您同意到假設ID等於類型名稱,則可以使用此方法。它允許您定義和繼承基類中的ID屬性。 雖然我同意這看起來可能乍看起來很奇怪。

public class Animal<T> where T : Animal<T> 
{ 
    public static readonly string ID = typeof(T).Name; 
} 

public class Dog : Animal<Dog> 
{ 
} 

public class Cat : Animal<Cat> 
{ 
} 

表達Cat.ID將返回Cat,並且Dog.ID將返回Dog

0

實現這樣

public class Animal : IType 
{ 
    private static string _ID = "Animal"; 

    string IType.ID 
    { 
     get 
     { 
      return getID(); 
     } 
    } 

    public virtual string getID() 
    { 
     return _ID; 
    } 
} 
public class Dog : Animal, IType 
{ 
    public static readonly string _dogID = "dog"; 
    string IType.ID 
    { 
     get 
     { 
      return _dogID; 
     } 
    } 
    public override string getID() 
    { 
     return _dogID; 
    } 

} 


.... 
// usage 
Animal a = new Animal(); 
Animal d = new Dog(); 
Console.WriteLine(a.getID()); 
Console.WriteLine(d.getID()); 
顯式接口