我有以下设置:
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()
从
答案 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(); }
}