为什么这个方法调用不会调用派生类?

时间:2015-01-21 21:23:04

标签: c# generics interface

我有一个接口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两次,我只是不确定如何解决它..

2 个答案:

答案 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>