C# создайте экземпляр производного класса в базовом классе

у меня есть следующие настройки:

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() вызывается из

3 ответов


Я могу придумать два способа решения этой проблемы. Один использует дженерики, а другой просто требует абстрактного метода. Первый простой.

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

можно использовать 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(); }
}