在我的許多嘗試中找到一個很好的解決方案在C#中的靜態覆蓋(在Objective-C中很容易,所以不要告訴我「這是不可能的」,或者說「只有對象是多態的「,因爲我知道)我試着用代表的方法。我的代碼是:靜態代理和覆蓋
public class Animal
{
public static Func<string> Name { get; protected set; }
static Animal()
{
Name =() => "Animal";
}
}
public class Cat : Animal
{
static Cat()
{
Name =() => "Cat";
}
}
但是當我打電話Cat.Name()
我仍然得到「動物」。我不是在尋求解決方案,我問:爲什麼?
1)字段'Animal.Name'只有一個實例。沒有單獨的「Cat.Name」。 'Cat.Name'和'Animal.Name'將總是返回相同的值,Cat或者Animal取決於哪個靜態構造函數是最近運行的。 2)靜態構造函數還沒有運行,所以它仍然返回舊名稱。靜態構造函數只有在訪問Cat的成員(或構造它的一個實例)時纔會運行,即使通過Cat來訪問,也不會生成Animal.Name。 – CodesInChaos
我會用反射和泛型的混合來解決你最初的問題。泛型類將爲每種類型都有一個獨特的靜態字段。 – CodesInChaos
這是一個好主意,你建議用類似「動物」,「動物」,......來代替一個課程方案嗎? –
Gerard