[英]C# Inheritance Problem
假设我有3个班级:
爷爷,爸爸和儿子。 儿子从父亲继承,父亲从祖父那里继承。
GrandDad有2种方法:
public virtual void foo();
public virtual void do();
爸爸继承了foo(),但是覆盖了do();
public override void do();
如果Son要修改foo(),则可以接受:
使爸爸覆盖foo(),但只需调用foo.base()? 然后,Son可以覆盖foo(),但是爸爸的foo()功能保持不变吗?
还是这是一种怪癖?
只要Dad
从未定义过foo()
,他就没有理由要做任何事情。 Son
应该能够从GrandDad
覆盖foo()
。
Dad
不必重写foo()
。 由于Dad
只是继承了Granddad
提供的版本(仍然是virtual
),因此这也意味着Son
可以得到,从而允许Son
覆盖foo()
。
public class Granddad {
public virtual void foo() {...}
public virtual void do() {...}
}
public class Dad {
public override void do() {...}
}
public class Son {
public override void foo() {...}
}
如果我了解您的问题,则无需与爸爸做任何事情。 只需在Son中实现foo()即可。
由于Son是父亲的后代,因此Son内的任何事物都不会改变父亲,因此,如果Son实现foo(),则父亲的foo()保持不变,继承自GrandDad。
问题的语义可能使您误入歧途。
如果您真的在做父亲,儿子,祖父...
您只需要上一堂课:人。 它将具有一个称为父亲的成员属性,该属性将指向另一个人。 这样,您可以拥有多代人,而不必被锁定在三代人中。
修改foo
是什么意思? 如果要覆盖,则Son可以简单地覆盖foo()
。 无需让Dad重写foo()
调用基本实现。
父亲不需要为儿子覆盖Foo而覆盖Foo。 Foo在继承链中一直是虚拟的,除非有人重写它并声明密封。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.