Еще один рецепт Windows: используйте переменную среды в масштабе всей системы NUMBER_OF_PROCESSORS
:
printf("%d\n", atoi(getenv("NUMBER_OF_PROCESSORS")));
Вы не можете этого сделать и сохранить иерархию. Если возможно, вы должны создать интерфейсы, которые определяют ваш идеал, затем создать подклассы базовых классов и реализовать интерфейсы. ссылаться только на интерфейсы (а не на типы базовых классов) в вашем коде.
Шаблон адаптера был создан специально для решения проблемы использования фреймворка, когда его API не совпадает в точности с ваши потребности.
Если вы хотите настроить набор функций, я бы сказал, что вы хотите создать оболочку, а не наследовать функциональность. Я тоже не знаю, как делать то, что вы хотите, на C #.
Подумайте, что, если какой-то код вне вашего контроля хочет этот экземпляр NHRepository
для чего-то ... но вы удалил функциональность из функции, которая ему нужна в вашем дочернем классе (которую вы должны отправить, поскольку это ваш единственный экземпляр NHRepository
.) Вот почему я не думаю, что можно вообще обойтись без какого-нибудь уродливого хака.
В C # нет концепции, аналогичной защищенному или частному наследованию в C ++.
Лучше всего объединить экземпляр класса и предоставить набор методов, которые вам интересны потребители, имеющие доступ к.
Хотя в вашем случае я не думаю, что это возможно, вы могли бы изучить создание интерфейса, который предоставляет только общие функции, с которыми вы хотите, чтобы потребители работали, чтобы ваша оболочка могла быть заменяемой в некоторых случаях для его совокупности.
Если вы используете Visual Studio, вы можете скрыть методы / свойства от intelliprompt с помощью этого атрибута:
class A
{
protected void MethodToExpose()
{}
[System.ComponentModel.EditorBrowsable(EditorBrowsableState.Never)]
protected void MethodToHide(object param)
{}
}
На самом деле он не избавится от функции, но если они только ваши внутренние люди. Это могло быть достаточно близко.
Я никогда не знал, что вы можете сделать это на C ++, хотя я мало знаю о C ++ . Боюсь, я согласен с Бликстом в том, что, вероятно, я бы это реализовал с помощью класса оболочки .
Может сработать (но я не уверен) просто переопределить функцию и выдать исключение при вызове ....
Насколько я знаю, вы не можете скрыть это так, как хотите. Я думаю, вы могли бы предотвратить его использование на практике:
class B : A
{
public new void MethodToHide(object param)
{
throw new DontUseThisMethodException();
}
protected void NewMethodInB()
{}
}
Это не самая лучшая вещь, поэтому вы, вероятно, захотите решить ее каким-либо другим способом ...
Ваш код в производном классе B не будет скрывать базовый метод от всех производных типов, только от самого себя. Вам нужно будет установить частный метод в базе. Единственный способ обойти эту проблему - создать другой базовый класс, который не предоставляет этот метод.
На самом деле вы можете скрыть метод A от C, если вы определили метод B как доступный из C.
Единственная проблема с вашим кодом в том, что вы используете "private" в объявлении скрытия... если бы вы использовали protected или public, у вас не было бы никаких проблем и все работало бы так, как вы ожидаете. Я постоянно так делаю с полями.