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)
{}
}
3 回答
如果 ISomething 始终是相同(或至少是常见)类型,则可以使超类的CreateFrom方法成为通用,并使用参数调用继承类的构造函数 . 只要确保你所有继承的类都有那个构造函数(不确定,但我不强迫'构造函数模式) .
这样您就可以通过调用来创建实例
或者您拆分创建和初始化:
您无法在接口上定义静态成员,因为静态成员属于某个类 . 但是我无法想象使用它的理由 . 你应该问问自己为什么需要这样的功能 . 子类是否真的需要实例化,或者可以轻松地与另一个独立(工厂)类完成相同的操作?
只需创建一个带有通用参数的简单工厂类,该参数指示要创建的内容 .
现在你可以这样简单地调用它:
我采用了类似要求的不同解决方案 . 在我的超类中碰巧是一个抽象的,我需要创建一个子类的实例来做一些事情,所以我做了以下技巧:
现在我继承自Element类的所有子类都需要覆盖newInstanceOfMyType方法以放弃其类型的实例,然后覆盖copyFrom方法以生成完美的克隆 . 现在人们可能会争辩说为什么抽象的克隆方法不能做同样的工作?是的,它可以 . 但是我需要克隆的子类实例以及一个空实例(没有从当前复制任何东西)所以我想出了这个架构 .