我有一个接口IDeepCloneable
,我用它来实现通用深度复制。我有一个基类和派生类,每个都实现IDeepCloneable
。我遇到派生类的问题。
以下是代码:
public class Program
{
public static void Main()
{
var a = new BaseClass();
var ac = a.DeepClone();
var b = (BaseClass)(new DerivedClass());
var bc = b.DeepClone();
}
}
public interface IDeepCloneable<T>
{
T DeepClone();
}
public class BaseClass : IDeepCloneable<BaseClass>
{
public string Value { get; set; }
public BaseClass(){}
public BaseClass(BaseClass copy)
{
Value = copy.Value;
}
public BaseClass DeepClone()
{
Console.WriteLine("BLAH1");
return new BaseClass(this);
}
}
public class DerivedClass : BaseClass, IDeepCloneable<DerivedClass>
{
public string SomeOtherValue { get; set; }
public DerivedClass(){}
public DerivedClass(DerivedClass copy)
: base(copy)
{
SomeOtherValue = copy.SomeOtherValue;
}
public new DerivedClass DeepClone()
{
Console.WriteLine("BLAH2");
return new DerivedClass(this);
}
}
输出:
BLAH1
BLAH1
我明白为什么它输出BLAH1两次,我只是不确定如何解决它..
答案 0 :(得分:2)
您的派生类需要override
DeepClone()
方法,并且基类中的DeepClone
方法需要virtual
。
现在,派生类中的DeepClone
方法与基类无关(除了具有相同的名称)。请参阅C#标准中的Interface Implementation Inheritance。
那就是说,看起来你正在尝试做深拷贝。您是否考虑过使用BinaryFormatter
对数据进行序列化和反序列化?
答案 1 :(得分:1)
因为那个基类或你的基类已经实现了接口,所以你可以将基类的DeepClone方法设置为虚拟并覆盖它,或者你可以做到
public abstract class BaseClass : IDeepCloneable<T>
...
public abstract T DeepClone(){}
并在DerivedClass中执行
public class DerivedClass : BaseClass<DerivedClass>