Encapsulation VS Inheritance - Как использовать защищенную функцию?
-
08-07-2019 - |
Вопрос
В языках ООП, таких как C # или VB.NET, если я создаю свойства или методы в суперклассе protected
, я не могу получить к ним доступ в своей форме - они могут быть доступны только в моем классе который наследует от этого суперкласса.
Чтобы получить доступ к этим свойствам или методам, мне нужно сделать их общедоступными
, которые отвергают инкапсуляцию, или переписать их в мой класс, который отвергает наследование.
Как правильно сделать это?
Решение
" нужно сделать их общедоступными, что препятствует инкапсуляции "
Не путайте хороший дизайн с неприглядными правилами видимости. Правила видимости сбивают с толку. Есть действительно два ортогональных вида видимости - подкласс и клиент. Не совсем понятно, почему мы что-то скрывали от наших подклассов. Но мы можем, с private
.
Вот что важно. Инкапсуляция не означает сокрытие. Защищенные и частные не являются неотъемлемой частью хорошей инкапсуляции. Вы можете сделать хороший дизайн, когда все открыто (например, так работает Python).
Защищенные / частные материалы - в основном - об управлении интеллектуальной собственностью: готовы ли вы совершить обязательство (в юридически обязательном порядке, «увидимся в суде, если это не сработает») путь) к интерфейсу? Если в разработке вашего программного обеспечения участвуют юристы, вам нужно добавить защиту и частную защиту к вещам, которым вы не привержены.
Если вам не нужно справляться с юристами, подумайте о правильной инкапсуляции, но оставьте все публично.
Другие советы
Если у вас есть код, который должен попросить класс выполнить определенную операцию, но класс не предоставляет вашему коду средства для этого, тогда класс не соответствует вашим требованиям к кодам.
Это все равно, что сказать, что у меня есть автомобиль (автомобиль) с защищенным рулевым колесом, поэтому я не могу получить к нему доступ. Машина мне не нужна.
Либо сделайте эти члены общедоступными (или, по крайней мере, внутренними) и используйте их, либо исключите класс и используйте тот, который дает вашему потребляющему коду необходимые функции.
Возможно, вы действительно ищете интерфейс. Интерфейс содержит членов, в которых нуждается ваш код, и вы реализуете этот интерфейс в своем классе. Преимущество в том, что ваш класс может определить, что к членам обращаются через этот интерфейс, а не через наследующий подкласс.
Извините, неясно, что вы имеете в виду под "моей формой" - Какова связь между вашей формой и вашими двумя классами? Если ваши классы являются элементами управления в том же проекте, и вы хотите получить доступ к свойствам из формы, вы должны использовать ключевое слово «internal».
Существует как минимум три способа ограничения количества пользователей, которые могут использовать какой-либо конкретный метод экземпляра для отдельных экземпляров класса:
<Ол> Если в сценариях с неполным доверием Reflection разрешит привязывать несвязанных делегатов к произвольным экземплярам объектов, можно использовать вложенные классы для усиления # 3, чтобы иметь доступ к полям private
для получить незаконный доступ к функциям private
; это определенно будет запрещено вне сценариев полного доверия.