class base_c
{
public virtual void a() {}
public virtual void b() {}
public virtual void c() {}
public virtual void d() {}
}
class other_c : base_c
{
public void a() {}
public new void b() {}
public override void c() {}
public override void d() {base.d();}
}
class Program
{
static void Main()
{
base_c game2 = new other_c();
game2.a();
game2.b();
game2.c();
game2.d();
}
}
'd'具有所需的行为,即更一般的base_c函数以及更具体的other_c,尽管如果订单是相反的方式会很好。要查看这有效,请使用调试器并逐步执行该程序。
这是实现这一结果的最佳途径吗?
虽然在此示例中可以更改“base_c game2 = ...”必须保留为base_c且无法更改为other_c。
答案 0 :(得分:6)
是的,如果你的意图是让子类扩展方法D中的继承行为,那么模式是在子代的d覆盖中调用base.d()。
如果你的意图是替换继承的行为(不是扩展),那么你就不会调用基本方法。
您还可以选择在覆盖方法中执行任何操作之前是先调用基本方法,还是在覆盖方法的中间或代码之后调用基本方法。
在适当的情况下,所有这些都是有效的技术。