是否可以使用更具体(通过返回类型)方法覆盖基本方法?

时间:2014-06-02 08:38:48

标签: c# class inheritance class-design

我有这样的课程。

public class Base{
    public virtual Base Clone(){ ...... }
}

public class Derived:Base{
    public Derived Clone(){ ...... }
    private override Base Clone(){ return Clone(); }

}

这个代码当然给了我一些编译错误,一个说在Derived类中有两个Clone()方法,另一个说覆盖方法必须与被覆盖的方法处于相同的可访问级别。 现在,由于直接不需要重写Base.Clone()的Derived.Clone()方法,我想用更具体的Derived.Clone()方法隐藏它,该方法返回Derived对象。我知道这可以在带有接口的C#中完成,但是可以对类进行相同的操作吗?

2 个答案:

答案 0 :(得分:4)

不是你表现出来的方式。一种常见的方法是为实现引入额外的方法:

public class Base
{
    public Base Clone() { return CloneImpl(); }
    protected virtual Base CloneImpl() { ... }
}

public class Derived : Base
{
    public new Derived Clone() { ... }
    protected override Base CloneImpl() { return Clone(); }
}

这满足了对多态性,替换等的所有期望。

答案 1 :(得分:2)

为了进一步了解Marc的答案,根据你的需要,我会更改内部方法的签名:

public class Base
{
    public Base Clone()
    {
        Base b = new Base();
        CloneImpl(b);
        return b;
    }
    protected virtual void CloneImpl(Base b) { ... }
}

public class Derived : Base
{
    public new Derived Clone()
    {
        Derived d = new Derived();
        this.CloneImpl(d);
        return d;
    }
    protected override void CloneImpl(Base b)
    {
        Derived d = b as Derived;
        ...
        base.CloneImpl(d);
    }
}

通过这种方式,内部方法可以为类型本身完成工作,并让基类执行它们共同的部分。