好的,这个标题有点不清楚,但除了解释之外,我想不出更好的方式来解决它......
假设我有一个类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()
方法?
答案 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的一部分,而不是派生类。