假设我有3个课程:
爷爷,爸爸和儿子。儿子继承自祖父,继承自祖父。GrandDad有两种方法:
public virtual void foo();
public virtual void do();
爸爸继承了foo(),但是覆盖了do();
public override void do();
如果Son想要修改foo(),它是否可以接受:
让爸爸覆盖foo(),但只需调用foo.base()?然后Son可以覆盖foo(),但是爸爸的foo()功能保持不变?
或者这是一种hacky方式?
答案 0 :(得分:3)
只要Dad
从未定义foo()
,就没有理由他必须做任何事情。 Son
应该可以从foo()
覆盖GrandDad
。
答案 1 :(得分:2)
Dad
不必覆盖foo()
。由于Dad
只是继承了Granddad
提供的版本(仍为virtual
),这意味着Son
也会获得Son
覆盖foo()
{1}}。
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() {...}
}
答案 2 :(得分:2)
如果我理解了你的问题,就没有必要和爸爸做任何事了。只需在Son中实现foo()。
由于Son是爸爸的后代,Son内部没有任何东西改变爸爸,所以如果Son实现了foo(),爸爸的foo()保持不变,继承自GrandDad。
答案 3 :(得分:1)
问题的语义可能会让你误入歧途。
如果你真的在做父亲,儿子,祖父......
你只需要一个班级:人。它将有一个名为Father的成员属性,它将指向另一个Person。这样,您可以拥有多代,而不是被锁定在三代。
答案 4 :(得分:0)
修改foo
是什么意思?如果你的意思是覆盖,那么Son可以简单地覆盖foo()
。无需让爸爸覆盖foo()
呼叫基础实施。
答案 5 :(得分:0)
爸爸不需要覆盖Foo for Son来覆盖Foo。