如何要求抽象类的子类型来实现静态实例化器

本文关键字:实现 静态 实例化 类型 抽象类 | 更新日期: 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的函数。 委托完全符合此模式。