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
asked Feb 27, 2011 at 19:10
3 Answers 3
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(){}
}
answered Feb 27, 2011 at 19:17
Sign up to request clarification or add additional context in comments.
1 Comment
Clivest
Thanks. I had thought of your first method, but wondered if there was a neater way of doing it using things like
this.GetType()
You can use Activator.CreateInstance(this.GetType());
answered Feb 27, 2011 at 19:17
2 Comments
Clivest
It wasn't me that down voted, but I would then need to cast the object it returns into
B
or C
without knowing which one. It doesn't solve my problemKen Wayne VanderLinde
You can just cast it to A, and you'll have everything you would be able to do the other way as well.
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(); }
}
answered Feb 27, 2011 at 19:59
Comments
lang-cs
new B()
ornew C()
- is there something specific in your context that makes this not possible?