Как скрыться (удаляют) методы базового класса в C#? [дубликат]

Еще один рецепт Windows: используйте переменную среды в масштабе всей системы NUMBER_OF_PROCESSORS:

printf("%d\n", atoi(getenv("NUMBER_OF_PROCESSORS")));
18
задан Ogre Psalm33 14 July 2009 в 15:49
поделиться

8 ответов

Вы не можете этого сделать и сохранить иерархию. Если возможно, вы должны создать интерфейсы, которые определяют ваш идеал, затем создать подклассы базовых классов и реализовать интерфейсы. ссылаться только на интерфейсы (а не на типы базовых классов) в вашем коде.

Шаблон адаптера был создан специально для решения проблемы использования фреймворка, когда его API не совпадает в точности с ваши потребности.

21
ответ дан 30 November 2019 в 05:51
поделиться

Если вы хотите настроить набор функций, я бы сказал, что вы хотите создать оболочку, а не наследовать функциональность. Я тоже не знаю, как делать то, что вы хотите, на C #.

Подумайте, что, если какой-то код вне вашего контроля хочет этот экземпляр NHRepository для чего-то ... но вы удалил функциональность из функции, которая ему нужна в вашем дочернем классе (которую вы должны отправить, поскольку это ваш единственный экземпляр NHRepository .) Вот почему я не думаю, что можно вообще обойтись без какого-нибудь уродливого хака.

14
ответ дан 30 November 2019 в 05:51
поделиться

В C # нет концепции, аналогичной защищенному или частному наследованию в C ++.

Лучше всего объединить экземпляр класса и предоставить набор методов, которые вам интересны потребители, имеющие доступ к.

Хотя в вашем случае я не думаю, что это возможно, вы могли бы изучить создание интерфейса, который предоставляет только общие функции, с которыми вы хотите, чтобы потребители работали, чтобы ваша оболочка могла быть заменяемой в некоторых случаях для его совокупности.

1
ответ дан 30 November 2019 в 05:51
поделиться

Если вы используете Visual Studio, вы можете скрыть методы / свойства от intelliprompt с помощью этого атрибута:

class A
{
    protected void MethodToExpose()
    {}

    [System.ComponentModel.EditorBrowsable(EditorBrowsableState.Never)]
    protected void MethodToHide(object param)
    {}
}

На самом деле он не избавится от функции, но если они только ваши внутренние люди. Это могло быть достаточно близко.

6
ответ дан 30 November 2019 в 05:51
поделиться

Я никогда не знал, что вы можете сделать это на C ++, хотя я мало знаю о C ++ . Боюсь, я согласен с Бликстом в том, что, вероятно, я бы это реализовал с помощью класса оболочки .

Может сработать (но я не уверен) просто переопределить функцию и выдать исключение при вызове ....

1
ответ дан 30 November 2019 в 05:51
поделиться

Насколько я знаю, вы не можете скрыть это так, как хотите. Я думаю, вы могли бы предотвратить его использование на практике:

class B : A
{
    public new void MethodToHide(object param)
    { 
        throw new DontUseThisMethodException();
    }

    protected void NewMethodInB()
    {}
}

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

1
ответ дан 30 November 2019 в 05:51
поделиться

Ваш код в производном классе B не будет скрывать базовый метод от всех производных типов, только от самого себя. Вам нужно будет установить частный метод в базе. Единственный способ обойти эту проблему - создать другой базовый класс, который не предоставляет этот метод.

0
ответ дан 30 November 2019 в 05:51
поделиться

На самом деле вы можете скрыть метод A от C, если вы определили метод B как доступный из C.

Единственная проблема с вашим кодом в том, что вы используете "private" в объявлении скрытия... если бы вы использовали protected или public, у вас не было бы никаких проблем и все работало бы так, как вы ожидаете. Я постоянно так делаю с полями.

1
ответ дан 30 November 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: