我有这样的课程。
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#中完成,但是可以对类进行相同的操作吗?
答案 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);
}
}
通过这种方式,内部方法可以为类型本身完成工作,并让基类执行它们共同的部分。