Как пропустить немедленную функцию переопределения базового класса - PullRequest
3 голосов
/ 27 февраля 2010

У меня есть следующая структура классов, и у меня есть множество классов, подобных C, полученных из B, в некоторых классах, которые я не хочу использовать B.OnShow (), но я хочу, чтобы A.OnShow () выполнялся из C Any фокусы?

abstract class A
{
   protected virtual void OnShow()
   {
        //some code
        base.OnShow();
   }
}

class B : A
{
    protected override void OnShow()
    {
      //some other code
      base.OnShow();
    }
}

class C : B
{
   protected override void OnShow()
   {
      //some other code
      base.OnShow();
   }
}

Ответы [ 3 ]

5 голосов
/ 27 февраля 2010

Не используйте C для расширения от B, вместо этого создайте новый класс "X", который продолжается от A и содержит части, которые в настоящее время находятся в B, которые вы хотите использовать для B и C, а затем C и B расширяются от ИКС". Тогда в B будут только те биты, которые вы хотите специально для B (немного абстрактно, но я думаю, что это имеет смысл).

Вообще говоря, если вы пытаетесь пропустить родительский метод, значит, вы делаете что-то не так.

2 голосов
/ 27 февраля 2010

Это звучит как проблема дизайна здесь. Если C действительно является B, он, вероятно, должен делать все, что B должен делать в OnShow. Если нет, вам, вероятно, следует использовать что-то иное, чем прямое наследование, или что-то иное, чем отдельный вызов виртуальной функции.

Если бы вы действительно этого хотели, вы могли бы иметь:

abstract class A
{
    protected virtual void OnShow()
    {
        UniqueOnShowStuff();
        base.OnShow();
    }
    protected virtual void UniqueOnShowStuff()
    {
     //
    }
}

class B : A
{
    protected override void OnShow()
    {
        // Things all B's need to Show
        base.OnShow();
    }
    protected override void UniqueOnShowStuff()
    {
        // Things most B's might want to show but don't have to
    }
}

class C : B
{
    protected override void OnShow()
    {
        // Things all C's need to show
        base.OnShow();
    }
    protected override void UniqueOnShowStuff()
    {
        // override without a base call so you don't show B's things
    }
}

Это ужасный паттерн, и я бы не советовал его, если бы вы могли придумать лучший способ изменить дизайн объектов / функциональности.

2 голосов
/ 27 февраля 2010

Эрик Липперт уже ответил на очень похожий вопрос и в основном заявил, что это не разрешено в C #.

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