В одном из моих многочисленных аттестатов, чтобы найти хорошее решение для статического переопределения на C# (это легко в объективе 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()
я все еще получаю "Animal". Я не прошу разрешения, я спрашиваю: почему?
1) Существует только один экземпляр поля 'Animal.Name'. Не существует отдельного «Cat.Name». «Cat.Name» и «Animal.Name» всегда будут возвращать одно и то же значение: «Cat» или «Animal» в зависимости от того, какой статический конструктор был последним для запуска. 2) Статический конструктор еще не запущен, поэтому он все еще возвращает старое имя. Статический конструктор запускается только при доступе к члену 'Cat' (или конструировать его экземпляр), который« Animal.Name »не существует, даже если он доступен через« Cat ». – CodesInChaos
Я бы решил вашу оригинальную проблему с сочетанием отражений и дженериков. У классов обобщений будет определенное статическое поле для каждого типа. – CodesInChaos
Это отличная идея, вы предлагаете заменить схему классов чем-то вроде «Animal», «Animal ', ...? –
Gerard