为什么此方法调用不调用派生的 class?
Why doesn't this method invocation invoke the derived class?
我有一个接口 IDeepCloneable
,我用它来实现通用深度复制。我还有一个基础 class 和一个派生 class,每个都实现 IDeepCloneable
。我 运行 遇到派生 classes 的问题。
代码如下:
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 两次,我只是不知道如何修复它..
您的派生 class 需要 override
DeepClone()
方法,您的 DeepClone
基 class 方法需要 virtual
.
现在,派生 class 中的 DeepClone
方法与基础 class 无关(除了具有相同的名称)。请参阅 C# 标准中的 Interface Implementation Inheritance。
也就是说,您似乎正在尝试进行深拷贝。您是否考虑过使用 BinaryFormatter
来序列化和反序列化您的数据?
由于基础 class 或您的基础已经实现了接口,因此您可以将基础 class 的 DeepClone 方法设为虚拟并覆盖它,或者您可以
public abstract class BaseClass : IDeepCloneable<T>
...
public abstract T DeepClone(){}
并在您的 DerivedClass 中执行
public class DerivedClass : BaseClass<DerivedClass>
我有一个接口 IDeepCloneable
,我用它来实现通用深度复制。我还有一个基础 class 和一个派生 class,每个都实现 IDeepCloneable
。我 运行 遇到派生 classes 的问题。
代码如下:
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 两次,我只是不知道如何修复它..
您的派生 class 需要 override
DeepClone()
方法,您的 DeepClone
基 class 方法需要 virtual
.
现在,派生 class 中的 DeepClone
方法与基础 class 无关(除了具有相同的名称)。请参阅 C# 标准中的 Interface Implementation Inheritance。
也就是说,您似乎正在尝试进行深拷贝。您是否考虑过使用 BinaryFormatter
来序列化和反序列化您的数据?
由于基础 class 或您的基础已经实现了接口,因此您可以将基础 class 的 DeepClone 方法设为虚拟并覆盖它,或者您可以
public abstract class BaseClass : IDeepCloneable<T>
...
public abstract T DeepClone(){}
并在您的 DerivedClass 中执行
public class DerivedClass : BaseClass<DerivedClass>