Clivest
Clivest

Reputation: 499

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

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?

Edit: bOrC needs to be the type of the particular derived class f() is called from

Upvotes: 7

Views: 6421

Answers (3)

vidstige
vidstige

Reputation: 13085

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

Upvotes: 0

Ken Wayne VanderLinde
Ken Wayne VanderLinde

Reputation: 19347

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

Upvotes: 4

unholysampler
unholysampler

Reputation: 17341

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

Upvotes: 9

Related Questions