public abstract class A
{
// constructors omitted
public abstract A Create(SomeData data);
}
public class B : A
{
// constructors omitted
public override A Create(SomeData data)
{
return new B(data);
}
}
我想要的是能够使Create
方法成为静态,这样我就可以获得B的实例而无需使用空构造函数创建无用的实例。 (如果您想知道为什么,A实际上是A<TFoo, TBar>
形式的泛型类型,其中TBar
对应于派生类型。众所周知,您无法使用a实例化泛型类型接受任何参数的构造函数。)
我已经知道静态方法与对象层次结构是分离的,只依赖于类型的名称。这意味着我不能将Create
作为抽象方法强制所有后代实现。还有其他方法可以实现这种模式吗?
答案 0 :(得分:2)
这样的事可能有效,取决于您的要求
public abstract class A
{
public string Data { get; set; }
public static T Create<T>(string data) where T : A, new()
{
return new T() { Data = data };
}
}
public class B : A { }
然后就可以了
A foo = A.Create<B>("foo");
答案 1 :(得分:1)
根本没办法做到这一点。继承基于C#中的实例方法,并且没有静态方法的等效功能。实现此模式的另一种方法是要求使用lambda代替静态方法。
例如(您提到实际类型为A<TFoo, TBar>
)
void UseIt<TFoo, TBar>(A<TFoo, TBar> p, Func<SomeData, TBar> func) {
TBar b = func();
...
}
消费者不关心Create
是静态的,实例的还是甚至称为create。通常他们关心的是一个函数,它需要SomeData
并返回TBar
。代表完全符合这种模式。