C#继承问题

本文关键字:问题 继承 | 更新日期: 2023-09-27 18:06:40

假设我有3个类:

爷爷,爸爸和儿子。儿子继承父亲的遗产,父亲继承祖父的遗产。

爷爷有两种方法:

public virtual void foo();
public virtual void do();

Dad继承了foo((,但重写了do((;

public override void do();

如果Son想要修改foo((,是否可以接受:

让Dad重写foo((,但只调用foo.base((?那么儿子可以覆盖foo((,但爸爸的foo(((功能保持不变?

或者这是一种不礼貌的方式?

C#继承问题

只要Dad从未定义过foo(),他就没有理由做任何事情。Son应该能够从GrandDad覆盖foo()

如果我理解了你的问题,就没有必要对爸爸做任何事情。只需在Son中实现foo((。

由于Son是爸爸的后代,Son中的任何东西都不会改变爸爸,所以如果Son实现了foo((,爸爸的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() {...}
}

问题的语义可能会让您误入歧途。

如果你真的在做《父亲、儿子、祖父》。。。

你只需要一个类:人。它将有一个名为Father的成员属性,该属性将指向另一个人。这样,你就可以有很多代人,而不是被关在三岁的时候。

修改foo是什么意思?如果你的意思是覆盖,那么儿子可以简单地覆盖foo()。不需要让Dad覆盖foo()调用的基本实现。

爸爸不需要覆盖Foo,儿子也可以覆盖Foo。Foo在继承链上一直是虚拟的,除非有人重写它并声明它是密封的。