在接口或产品类的抽象超类中定义工厂方法
问题描述:
我有一个抽象的超类和继承自它的子类。在接口或产品类的抽象超类中定义工厂方法
每个子类MySubclass
应该有一个public static MySubclass CreateFrom(ISomething something)
工厂方法。其参数的接口对于所有子类都是相同的,但返回类型必须始终是相应子类的类型。
我可以以某种方式实现此目的,在接口或抽象超类方法定义之后具有静态工厂方法,而无需为每个单独的子类创建单独的静态工厂类?
答
如果ISomething是始终不变的(或至少一个共同的)类型,你可以做的了CreateFrom方法超类泛型并用参数调用继承类的构造函数。只要确保所有的继承类都具有该构造函数(不确定,但我认为没有办法'强制'构造函数模式)。
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)
{}
}
答
您不能在接口上定义静态成员,因为静态成员属于某个类。但我无法想象有这样一个理由。你应该问自己为什么你需要这样的功能。一个子类是否真的需要实例化,或者是否可以轻松地使用另一个独立的(工厂)类?
只需创建一个简单的工厂类,其中包含指示要创建的通用参数。
class Factory<T> where T: new()
{
T CreateFrom(ISomething param)
{
return new T();
}
}
现在,你可以简单地调用它是这样的:
var myFactory = new Factory<MyClass>();
myFactory.CreateFrom(mySomething);
答
我使出在similiar样的要求,不同的解决方案。在我的超正好是一个抽象我需要创建类的实例,用它做的东西,所以我做了以下技巧:
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;
}
}
现在我所有的子类从元素类继承覆盖newInstanceOfMyType方法所需放弃其类型的实例,然后重写copyFrom方法以生成完美的克隆。现在人们可能会争辩说为什么抽象克隆方法不能做同样的工作?是的,它可以。但我需要克隆的子类实例以及一个空实例(不需要从当前的任何拷贝),所以我想出了这个架构。
但不是静态的...... – buffjape
然而,这将需要一个子类的实例,因为CreateFrom方法不是静态的。我想这正是他想要避免的。 –