Можно ли обнаружить контекст класса в унаследованном статическом методе? - PullRequest
6 голосов
/ 09 сентября 2009

Хорошо, этот заголовок немного неясен, но я не могу придумать лучшего способа выразить его, кроме как объяснить его ...

Скажем, у меня есть класс Animal со статическим, обобщенным методом:

public static T Create<T>() where T : Animal {
  // stuff to create, initialize and return an animal of type T
}

И у меня есть подклассы Dog, Cat, Hamster и т. Д. Чтобы получить Dog, я могу написать:

Dog d = Animal.Create<Dog>();

или

Dog d = Dog.Create<Dog>();

что на самом деле одно и то же. Но кажется глупым, что приходится писать Dog столько раз, так как я уже вызываю статический метод через подкласс Dog.

Можете ли вы придумать какой-нибудь умный способ написания метода Create() в базовом классе, чтобы я мог вызвать

Dog d = Dog.Create();
Cat c = Cat.Create();
Hamster h = Hamster.Create();

без записи Create() метода в каждом из подклассов?

Ответы [ 3 ]

10 голосов
/ 09 сентября 2009

Вы можете сделать класс Animal универсальным.

class Animal<T> where T : Animal<T>
{
    public static T Create()
    {
        // Don't know what you'll be able to do here
    }
}

class Dog : Animal<Dog>
{

}

Но как класс Animal знает, как создавать экземпляры производных типов?

2 голосов
/ 09 сентября 2009

Я бы сделал класс Animal абстрактным с помощью статического метода Create; это фактически отправная точка для фабрики. На самом деле, похоже, что вы отменяете фабричный класс.

Если вы добавляете абстрактный Initialize метод к классу Animal, метод Create становится:

public static T Create<T>() where T : Animal {
  T animal = new T();   //may need a "new" in the declaration
  animal.Initialize();  //or Create or whatever or you put this logic
                        //   in the constructor and don't call this at all.
  return animal;
}
1 голос
/ 09 сентября 2009

В дополнение к другим ответам об этом, используя отражение, вы можете увидеть, что Create всегда будет частью Animal, а не производного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...