Проблема наследования C # - PullRequest
0 голосов
/ 25 августа 2011

Допустим, у меня есть 3 класса:

Дед, папа и сын. Сын наследует от папы, который наследует от дедушки.

GrandDad имеет 2 метода:

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

Папа наследует foo (), но переопределяет do ();

public override void do();

Если Сын хочет изменить foo (), допустимо ли:

заставить папу переопределить foo (), но просто вызвать foo.base ()? Тогда Сын может переопределить foo (), но функциональность папы foo () остается прежней?

Или это хакерский путь?

Ответы [ 6 ]

3 голосов
/ 25 августа 2011

Пока Dad никогда не определял foo(), нет никаких причин, по которым он должен что-то делать. Son должен иметь возможность переопределить foo() из GrandDad.

2 голосов
/ 25 августа 2011

Если я понял твой вопрос, нет нужды что-либо делать с папой. Просто внедрите foo () в Son.

Поскольку Сын является потомком папы, ничто в Сыне не меняет папу, поэтому, если Сын реализует foo (), папина foo () остается тем же, наследуя от GrandDad.

2 голосов
/ 25 августа 2011

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() {...}
}
1 голос
/ 25 августа 2011

Семантика проблемы могла сбить вас с пути.

Если вы ДЕЙСТВИТЕЛЬНО делаете Отца, Сына, Деда ...

Вам нужен только один класс: Персона.Он будет иметь свойство участника с именем Father, которое будет указывать на другого человека.Таким образом, вы можете иметь много поколений, а не быть заперты на три.

0 голосов
/ 25 августа 2011

Папе не нужно переопределять Foo, чтобы Сын переопределил Foo. Foo является виртуальным на протяжении всей цепочки наследования, если кто-то не переопределит его и не объявит его запечатанным.

0 голосов
/ 25 августа 2011

Что вы подразумеваете под модификацией foo? Если вы имеете в виду переопределение, то сын может просто переопределить foo(). Не нужно заставлять папу переопределять foo() вызывающую базовую реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...