0
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 实际上是 form 的泛型类型A<TFoo, TBar>,其中TBar对应于派生类型。众所周知,您不能使用带有任何参数的构造函数来实例化泛型类型。)

我已经知道静态方法与对象层次结构分离,仅依赖于类型的名称。这意味着我不能Create作为一种抽象方法来强制所有后代实现。还有另一种方法可以实现这种模式吗?

4

2 回答 2

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");
于 2013-08-14T16:20:25.373 回答
1

根本没有办法做到这一点。继承基于 C# 中的实例方法,并且没有静态方法的等效功能。不过,实现此模式的另一种方法是需要 lambda 来代替静态方法。

例如(你提到的实际类型是A<TFoo, TBar>

void UseIt<TFoo, TBar>(A<TFoo, TBar> p, Func<SomeData, TBar> func) {
  TBar b = func();  
  ...
}

消费者不在乎Create是静态的、实例化的,还是调用创建的。通常,他们关心的只是拥有一个接受 aSomeData并返回 a的函数TBar。代表完全符合这种模式。

于 2013-08-14T16:14:51.160 回答