在产品 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 的克隆实例以及一个空实例(不从当前复制任何东西)所以我想出了这个架构。
我有一个继承自它的抽象超级 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 的克隆实例以及一个空实例(不从当前复制任何东西)所以我想出了这个架构。