Уменьшение видимости свойств базового класса
Я создал базовый класс, который имеет много общедоступных свойств и был использован отлично. Теперь я хочу использовать этот класс для получения другого класса, но я не хочу, чтобы некоторые его свойства были представлены вне производного класса, который его наследует. Есть ли способ, которым открытые свойства базового класса не могут быть предоставлены вне его производного класса (свойства, которые должны быть скрыты, являются открытыми, потому что они используются в других классах, которые его наследуют). Любая помощь будет очень полезна.
3 ответа
Вы хотите сделать их защищенными.
Из MSDN:
Защищенный член доступен в пределах своего класса и экземплярами производного класса.
То, что вы просите, просто невозможно. Если тип B наследуется от типа A, то это тип "is-a" A. B имеет по крайней мере тот же доступный контракт, что и тип A. Нельзя спрятать публичного члена А без существенного нарушения этого контракта.
Если вы попадаете в сценарий, в котором вы хотите использовать A, но раскрываете только подмножество свойств, наследование не является правильным решением: сдерживание - это правильное решение.
public class B {
private A m_wrapped;
// Expose only the properties you want to expose here
}
Я согласен с cadrell0 в том, чтобы пометить их как защищенные, но на тот случай, если вы ищете решение, где свойства на самом деле public
, но скрытый для пользователей определенного производного класса, вы можете использовать явный интерфейс
interface IHaveMethodsYouCanHide { void Foo(); }
class Base : IHaveMethodsYouCanHide { public void Foo() {} }
class NonHidingDerived : Base { }
class HidingDerived : Base, IHaveMethodsYouCanHide
{
void IHaveMethodsYouCanHide.Foo() {}
}
С помощью этого кода идентификаторы типа HidingDerived не будут разрешать вызовы Foo (если сначала не приведено IHaveMethodsYouCanHide).