开发者

C# create instance of the derived class in the base class

开发者 https://www.devze.com 2023-02-14 05:55 出处:网络
I have the following set up: public abstract class A { public void f() { //Want to make an instance of B or C here

I have the following set up:

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

Is this possible? If so how?

开发者_如何学GoEdit: bOrC needs to be the type of the particular derived class f() is called from


I can think of two ways to solve this issue. One uses generics and the other just requires an abstract method. First the simple one.

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

And now with generics

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


You can use Activator.CreateInstance(this.GetType());


This is not possible, and would lead to some weird consequences if it was. However, there is an easy work around rendering code that is easy to read.

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号