为什么此方法调用不调用派生的 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>