C # создать экземпляр производного класса в базовом классе - PullRequest
7 голосов
/ 27 февраля 2011

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

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 ]

8 голосов
/ 27 февраля 2011

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

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(){}
}
4 голосов
/ 27 февраля 2011

Вы можете использовать Activator.CreateInstance(this.GetType());

0 голосов
/ 27 февраля 2011

Это невозможно, и если бы это было так, это привело бы к некоторым странным последствиям.Тем не менее, существует простой способ обработки кода, который легко читается.

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(); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...