是否可以在继承的静态方法中检测类上下文?

时间:2009-09-09 15:10:33

标签: c# generics inheritance

好的,这个标题有点不清楚,但除了解释之外,我想不出更好的方式来解决它......

假设我有一个类Animal,使用静态通用方法:

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

我有子类DogCatHamster等。为了获得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 个答案:

答案 0 :(得分:10)

您可以将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类如何知道如何创建派生类型的实例?

答案 1 :(得分:2)

我会使用静态Create方法创建Animal类摘要;它实际上是工厂的起点。事实上,看起来你正在撤消一个工厂类。

如果向Animal类添加一个抽象 Initialize 方法,则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;
}

答案 2 :(得分:1)

除了关于它的方法的其他答案之外,你可以看到使用反射,Create将始终仍然是Animal的一部分,而不是派生类。