I have my abstract base class A:
public abstract class A : ICloneable {
public int Min { get; protected set; }
public int Max { get; protected set; }
public A(int low, int high)
{
this.Min = low;
this.Max = high;
}
//...
public object Clone()
{
return new this(this.Min, this.Max); //<-- ??
}
}
Which is extended by my class B:
public class B : A
{
public B(int low, int high) : base(low, high) { }
//...
}
Since A is abstract, it cannot be instantiated, but the derived class can. Is it possible to, from class A, create a new instance of class B?
Suppose class A has many derived classes, how will it know which one to instantiate?
Well, I want to instantiate the same class (or type) my currently A is.
That is, if I'm calling the Clone
method from a class B, I want to instantiate a new B.
If I'm calling the Clone
method from a class C, I want to instantiate a new C.
My approach was to write something like:
return new this(this.Min, this.Max);
But that doesn't seem to work nor compile.
Is it possible to accomplish this in C#?
If it isn't, is there an explanation so I can understand?
This can be done and your current approach is a well defined design pattern, though most implementations make the
Clone
an abstract virtual method and override it in all subclasses.Since you are using C# you could make use of the
Activator
class. You can make theClone
method virtual (not === abstract) with a default implementation of.Edit - If you do not have a default parameter-less constructor in all of your derived classes, you can add parameters to the
Activator.CreateInstance
methodFor varying constructors on the derived types I would recommend you override the
Clone
method specifically for those types instead of using the default implementation ofClone
.Yes, this is possible with an abstract factory method on your base class
While I like Jamiec solution, I'm missing dirty solution using reflection :)