Я не понимаю, почему Base
не может реализовать ICloneable
:
public abstract class Base : ICloneable
{
public object Clone()
{
return MemberwiseClone();
}
}
Это все равно вернет правильный экземпляр (то есть тот же тип, что и существующий объект) при вызове напроизводный класс.Любые поля в производных классах также будут скопированы, хотя и поверхностно.В качестве конкретного примера:
using System;
public abstract class BaseClass : ICloneable
{
public object Clone()
{
return MemberwiseClone();
}
}
public class Derived : BaseClass
{
private readonly string name;
public Derived(string name)
{
this.name = name;
}
public override string ToString()
{
return "Derived with name " + name;
}
}
class Test
{
static void Main(string[] args)
{
BaseClass b = new Derived("fred");
object clone = b.Clone();
Console.WriteLine(clone.ToString());
}
}
РЕДАКТИРОВАТЬ: Я подозреваю вы хотите что-то вроде:
public abstract class ObjectThatHasPosition : ICloneable
{
public Point CurrentPosition { get; set; }
public ObjectThatHasPosition(Point p)
{
CurrentPosition = p;
}
public object Clone()
{
var clone = (ObjectThatHasPosition) MemberwiseClone();
clone.CurrentPosition = (Point) CurrentPosition.Clone();
}
}