C#在基类中创建派生类的实例

C#在基类中创建派生类的实例,c#,polymorphism,C#,Polymorphism,我有以下设置: public abstract class A { public void f() { //Want to make an instance of B or C here //A bOrC = new ? } public abstract void f2(); } public class B : A { public override void f2(){} } public class C : A { publ

我有以下设置:

public abstract class A
{
    public void f()
    {
        //Want to make an instance of B or C here
        //A bOrC = new ?
    }
    public abstract void f2();
}
public class B : A { public override void f2(){} }
public class C : A { public override void f2(){} }
这可能吗?如果是,怎么做


Edit:
bOrC
需要是特定派生类的类型
f()
是从调用的。我可以想出两种方法来解决这个问题。一个使用泛型,另一个只需要一个抽象方法。首先是简单的

public abstract class A
{
    public void f()
    {
        A bOrC = newInstance();
    }
    public abstract void f2();
    protected abstract A newInstance();
}
public class B : A {
    public override void f2(){}
    public override A newInstance(){
        return new B();
    }
}
public class C : A {
    public override void f2(){}
    public override A newInstance(){
        return new C();
    }
}
现在是泛型

public abstract class A<T> where T : A, new()
{
    public void f()
    {
        A bOrC = new T();
    }
    public abstract void f2();
}
public class B : A<B> {
    public override void f2(){}
}
public class C : A<C> {
    public override void f2(){}
}
公共抽象类A,其中T:A,new()
{
公共空间f()
{
A bOrC=新的T();
}
公开摘要无效f2();
}
B级:A级{
公共覆盖无效f2(){}
}
公共C类:A{
公共覆盖无效f2(){}
}

您可以使用
Activator.CreateInstance(this.GetType())

这是不可能的,如果是的话,会导致一些奇怪的后果。但是,有一种简单的方法可以轻松地呈现易于阅读的代码

public abstract class A
{
    public void f()
    {
        //Want to make an instance of B or C here
        //A bOrC = new ?
        A bOrC = Create();
    }
    public abstract void f2();
    public abstract A Create();
}
public class B : A {
  public override void f2(){}
  public override A Create() { return new B(); }
}
public class C : A {
  public override void f2(){}
  public override A Create() { return new C(); }
}

当然,您可以
new B()
new C()
-在您的上下文中是否有某些特定的东西使得这不可能?我认为重点是需要一个B或C的实例,但在调用时不知道这些类型中的哪一个。是f()吗方法来创建当前实例或其他东西的副本-即创建子类型的新实例?您能更具体一点吗?也许这有帮助:谢谢。我已经想到了您的第一个方法,但不知道是否有一种更简洁的方法可以使用
this.GetType()
这样的东西来实现。投票被否决的不是我,而是我需要将它返回的对象强制转换为
B
C
,而不知道是哪一个。它不能解决我的问题,你可以把它抛到一边,你也可以用另一种方式做任何事情。