在产品 class 的接口或抽象超类 class 中定义工厂方法

Defining factory methods in interfaces or abstract superclasses of the product class

我有一个继承自它的抽象超级 class 和子class。

每个子class MySubclass 应该有一个public static MySubclass CreateFrom(ISomething something) 工厂方法。它的参数接口对于所有子classes都是相同的,但是return类型当然必须始终是相应子class.

的类型

我能否以某种方式实现这一点,使静态工厂方法遵循接口或抽象超级class方法定义,而无需为每个子class创建单独的静态工厂class?

您不能在接口上定义静态成员,因为静态成员属于某个 class。但是我无法想象使用它的理由。您应该问问自己为什么需要这样的功能。 sub-class 真的必须实例化自己,还是可以用另一个独立的 (factory-)class 轻松完成同样的事情?

只需创建一个简单的工厂-class,并使用指示要创建的内容的通用参数。

class Factory<T> where T: new()
{
    T CreateFrom(ISomething param)
    {
        return new T();
    }

}

现在你可以简单地这样称呼它:

var myFactory = new Factory<MyClass>();
myFactory.CreateFrom(mySomething);

如果 ISomething 总是相同的(或至少是共同的)类型,您可以使 superclass 的 CreateFrom 方法通用并调用带有参数的继承 class 的构造函数。只需确保所有继承的 classes 都具有该构造函数(不确定,但我认为没有办法 'force' 构造函数模式)。

public abstract class SuperClass
{
    public static T CreateFrom(ISomething something)
    {
        return (T)Activator.CreateInstance(typeof(T), something);
    }
}

public class InheritedClass : SuperClass
{
    public InheritedClass(ISomething something)
    {}
}

这样你就可以通过调用

来创建实例
SuperClass.CreateFrom<InheritedClass>(something);

或者你拆分创建和初始化:

public abstract class SuperClass
{
    protected abstract void Initialize(ISomething something);

    public static T CreateFrom(ISomething something) where T : new()
    {
        T result = new T();
        T.Initialize(something);
    }
}

public class InheritedClass : SuperClass
{
    public InheritedClass()
    {}

    protected override Initialize(ISomething something)
    {}
}

对于类似的需求,我采用了不同的解决方案。在我的 superclass 中,它恰好是一个抽象的,我需要创建一个 subclass 的实例来用它做一些事情,所以我做了以下技巧:

public abstract class Element
{
    protected virtual void copyFrom(Element other)
    {  
    }

    protected abstract Elememt newInstanceOfMyType();
    public object clone()
    {
        var instance= newInstanceOfMyType();
        instance.copyFrom(this);
        return instance;        
    }
}

现在,我所有继承自 Element class 的子class 都需要覆盖 newInstanceOfMyType 方法以放弃其类型的实例,然后还覆盖 copyFrom 方法以生成完美的克隆。现在人们可能会争论为什么抽象的 Clone 方法不能做同样的工作?是的,它可以。但是我需要 subclass 的克隆实例以及一个空实例(不从当前复制任何东西)所以我想出了这个架构。