I have an abstract base class Base
which has some common properties, and many derived ones which implement different logic but rarely have additional fields.
public abstract Base
{
protected int field1;
protected int field2;
....
protected Base() { ... }
}
Sometimes I need to clone the derived class. So my guess was, just make a virtual Clone
method in my base class and only override it in derived classes that have additional fields, but of course my Base
class wouldn't be abstract anymore (which isn't a problem since it only has a protected
constructor).
public Base
{
protected int field1;
protected int field2;
....
protected Base() { ... }
public virtual Base Clone() { return new Base(); }
}
public A : Base { }
public B : Base { }
The thing is, since I can't know the type of the derived class in my Base one, wouldn't this lead to have a
Base
class instance even if I call it on the derived ones ? (a.Clone();
) (actually after a test this is what is happening but perhaps my test wasn't well designed that's why I have a doubt about it)Is there a good way (pattern) to implement a base
Clone
method that would work as I expect it or do I have to write the same code in every derived class (I'd really like to avoid that...)
Thanks for your help
I did something similar as Alexander Simonov, but perhaps simpler. The idea is (as I said in a comment) to have just one
Clone()
in the base class and leave all the work to a virtualCloneImpl()
which each class defines as needed, relying on theCloneImpl()
s of the base classes.Creation of the proper type is left to C#'s
MemberwiseClone()
which will do whatever it takes for the object that's calling. This also obviates the need for a default constructor in any of the classes (none is ever called).Output: