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

时间:2011-02-27 19:10:06

标签: 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 { public override void f2(){} }

这可能吗?如果是这样的话?

修改: bOrC需要是特定派生类的类型f()

调用

3 个答案:

答案 0 :(得分:8)

我可以想出两种方法来解决这个问题。一个使用泛型,另一个只需要一个抽象方法。首先是简单的。

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(){}
}

答案 1 :(得分:4)

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

答案 2 :(得分:0)

这是不可能的,如果是这样的话会导致一些奇怪的后果。但是,渲染代码很容易阅读。

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(); }
}