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