Ограничение доступа к унаследованным свойствам C # - PullRequest
1 голос
/ 20 мая 2009

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

Можно ли этого достичь?

Надеюсь, я был достаточно ясен, если нет, пожалуйста, дайте мне знать, постараюсь объяснить себя лучше.

EDIT:

Правильно, спасибо всем за ответы, однако я не думаю, что был достаточно ясен. То, что я пытаюсь сделать, это:

Я написал элемент управления Windows, который расширяет элемент управления ListView. ListView имеет открытую коллекцию Items, которую можно изменять. Это все хорошо, однако я написал новые методы для добавления элементов в просмотр списка из-за дополнительных данных, которые мне нужны.

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

Поскольку мы надеемся использовать этот элемент управления несколько раз в разных проектах, мы боимся, что рано или поздно будет использован способ добавления элементов в коллекцию элементов по умолчанию (на самом деле, вопрос времени). Мы просто ищем способ предотвратить это, например, генерировать исключение, когда коллекция Items увеличивается, но так, как это было задумано.

Надеюсь, теперь все это имеет смысл.

Ответы [ 5 ]

4 голосов
/ 20 мая 2009

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

public partial class CustomListView : ListView
{
    public CustomListView()
    {
        InitializeComponent();
    }

    public System.Windows.Forms.ListView.ListViewItemCollection CustomExposedItems
    {
        get
        {
            return base.Items;
        }

    }

    [EditorBrowsable(EditorBrowsableState.Never)]    
    [Browsable(false)]    
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [Obsolete("Use the new custom way of adding items xyz")]
    public new System.Windows.Forms.ListView.ListViewItemCollection Items    
    { 
        get { throw new NotSupportedException(); }    
    }

}
4 голосов
/ 20 мая 2009

Наследование сводится к тому, чтобы сказать: «Вы можете использовать этот производный класс так же, как вы можете использовать базовый класс, и он обеспечивает специализированное поведение».

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

3 голосов
/ 20 мая 2009

Нет, вы не можете этого сделать. Лучшее, что вы можете сделать, - это создать класс и обернуть базовый класс, производный от него, но это, конечно, нарушит наследование. (Я предполагаю, что вы не можете изменить базовый класс. Если вы можете, вы должны переосмыслить дизайн, потому что похоже, что ваш новый класс не должен быть производным от базового класса.)

class BaseClass
{
     public String IWantThis { get; set; }
     public String IDoNotWantThis { get; set; }
}

class MyClass
{
    private BaseClass baseClass = new BaseClass();

    public String IWantThis
    {
        get { return this.baseClass.IWantThis; }
        set { this.baseClass.IWantThis = value; }
    }
}
1 голос
/ 20 мая 2009

Вы не можете сделать это по наследству. Это на самом деле то, что наследование. is-отношение не может уменьшить интерфейс. Производный класс должен быть полным представлением базового класса.

Превратите свое наследство в ссылку. Вы повторно используете реализацию своего «базового класса», вызывая его. (Композиция вместо наследования.) Если вам нужен полиморфизм, добавьте общий интерфейс или переместите общую часть в отдельный абстрактный базовый класс.

0 голосов
/ 20 мая 2009

Я не использую AOP, возможно, PostSharp, для размещения свойства, которое вы не хотите использовать, а затем вы можете обработать его соответствующим образом с вашим аспектом.

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