Encapsulation VS Inheritance - Как использовать защищенную функцию? - PullRequest
2 голосов
/ 14 ноября 2008

В языках ООП, таких как C # или VB.NET, если я создаю свойства или методы в суперклассе protected, я не могу получить к ним доступ в своей форме - к ним можно получить доступ только в моем классе, который наследуется от этого супер класс.

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

Как правильно это сделать?

Ответы [ 4 ]

2 голосов
/ 14 ноября 2008

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

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

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

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

1 голос
/ 14 ноября 2008

"нужно сделать их публичными, что побеждает инкапсуляцию"

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

Вот что важно. Инкапсуляция не означает сокрытие. Защищенные и частные не являются неотъемлемой частью хорошей инкапсуляции. Вы можете сделать хороший дизайн, когда все открыто (например, так работает Python).

Защищенный / частный материал - в основном - об управлении интеллектуальной собственностью: готовы ли вы совершить обязательство (юридически обязательным способом «увидимся в суде, если не получится») ) к интерфейсу? Если в разработке вашего программного обеспечения участвуют юристы, то вы заботитесь о том, чтобы добавить защиту и конфиденциальность к вещам, которым вы не привержены.

Если вам не нужно справляться с юристами, подумайте о правильной инкапсуляции, но оставьте все публично.

0 голосов
/ 24 апреля 2012

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

  1. Определите метод как `protected`,` internal` или `private`. В первом случае метод экземпляра можно будет использовать только из методов производного класса того же экземпляра; во втором случае все классы в сборке будут иметь доступ к этим методам, а внешние классы не будут; в третьем случае никакие внешние классы, даже производные в той же сборке, не будут иметь доступа, если только их код не вложен в декларирующий класс.
  2. Определите метод как `public`, но классы, которые создают экземпляры, сохраняют их в секрете и никогда не выставляют их внешнему миру. Любой, кто хочет вызвать метод экземпляра объекта, должен иметь экземпляр для его вызова. Если класс содержит экземпляры, но никогда не предоставляет прямых ссылок на них, единственными методами экземпляров, которые могут когда-либо использоваться в этих экземплярах, будут те, которые сами классы хранения используют.
  3. Определите метод как `public`, но у него есть конструктор, который принимает местоположение, в котором может храниться один или несколько делегатов для закрытых методов. Код с доступом к этим делегатам сможет вызывать методы, на которые он ссылается, но другой код не будет (за исключением использования Reflection способами, которые, я думаю, могут использоваться только в сценариях полного доверия).

Если в сценариях с неполным доверием Reflection разрешит привязывать несвязанных делегатов к произвольным экземплярам объектов, можно использовать вложенные классы для усиления # 3, чтобы иметь доступ к полям private для получения незаконного доступа к private функций; это определенно будет запрещено вне сценариев полного доверия.

0 голосов
/ 14 ноября 2008

Извините, не понятно, что вы подразумеваете под "в моей форме" - каковы отношения между вашей формой и двумя вашими классами? Если ваши классы являются элементами управления в том же проекте, и вы хотите получить доступ к свойствам из формы, вы должны использовать ключевое слово «internal».

...