在我的许多尝试中找到一个很好的解决方案在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