Abstract class --> 获取当前派生的新实例 class

Abstract class --> get a new instace of current derived class

是否可以获取当前派生 class 的新实例,该实例正在调用基本抽象 class 的函数?例如:

class Bar1 : Foo
{

}
class Bar2 : Foo
{

}

abstract class Foo
{
    public Foo CreateAnotherInstance()
    {
        return new Bar1/Bar2();   // depending on the calling derived class
    }
}

应该导致:

Bar1 bar1 = new Bar1();
Bar2 bar2 = new Bar2();
Foo bar1_2 = bar1.CreateAnotherInstance();  // Should be a new Bar1 instance
Foo bar2_2 = bar1.CreateAnotherInstance();  // Should be a new Bar2 instance

我发现创建实例的唯一方法是使用抽象方法,其中在每个派生 class 中创建实例,例如:

class Bar1 : Foo
{
    public override Foo CreateAnotherInstance()
    {
        return new Bar1();
    }
}

class Bar2 : Foo
{
    public override Foo CreateAnotherInstance()
    {
        return new Bar2();
    }
}

abstract class Foo
{
    public abstract Foo CreateAnotherInstance();
}

但是这样一来,我必须为每个派生的方法创建方法 class。

这个问题有更简单的解决方案吗?

感谢 René Vogt 和 mjwills 的回答:

正在使用

(Foo)Activator.CreateInstance(GetType()); 

所以把摘要class改成:

abstract class Foo
{
    public Foo CreateAnotherInstance()
    {
        return (Foo)Activator.CreateInstance(GetType());
    }
}

如果构造函数不是无参数的:

(Foo)Activator.CreateInstance(GetType(), para1, para2, ...); 

虽然 Activator.CreateInstance 是执行此操作的好方法,但我不确定这是属于基本抽象 class 的方法,还是这些 class 中的任何一个es。这不会破坏多态性吗?或者至少是 Liskov 替换原则?

无论如何,作为替代方案,创建一个适用于任何类型的简单方法,而不仅仅是上面的那些。例如

public static T CreateNew<T>(params object[] parms)
{
  return (T) Activator.CreateInstance(typeof(T), parms);
}

这也允许您传入构造函数参数(如果有的话)。