如何要求抽象类的子类型来实现静态实例化器
本文关键字:实现 静态 实例化 类型 抽象类 | 更新日期: 2023-09-27 18:27:44
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
对应于派生类型。众所周知,不能使用接受任何参数的构造函数实例化泛型类型。
我已经知道静态方法与对象层次结构分离,仅依赖于类型的名称。这意味着我不能将Create
作为我强迫所有后代实现的抽象方法。有没有另一种方法可以实现此模式?
这样的东西可能会起作用,具体取决于您的要求
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");
根本没有办法做到这一点。 继承基于 C# 中的实例方法,对于静态方法没有等效的功能。实现此模式的另一种方法是要求使用 lambda 代替静态方法。
例如(您提到实际类型是A<TFoo, TBar>
(
void UseIt<TFoo, TBar>(A<TFoo, TBar> p, Func<SomeData, TBar> func) {
TBar b = func();
...
}
消费者并不关心Create
是静态的、实例的,甚至是所谓的 create。 通常,他们所关心的只是一个接受SomeData
并返回TBar
的函数。 委托完全符合此模式。