C#继承问题

时间:2011-08-25 02:00:06

标签: c# inheritance

假设我有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方式?

6 个答案:

答案 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。 在继承链中一直是虚拟的,除非有人覆盖它并声明密封。