Реализация интерфейса, но изменение члена на частный - PullRequest
7 голосов
/ 08 июля 2010

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

Ответы [ 6 ]

12 голосов
/ 08 июля 2010

Смысл интерфейсов в том, что они предоставляют контракт, который другие объекты могут использовать для связи с вашим объектом. Если вы измените элемент, который объявлен как public в интерфейсе, на private, значит, вы не выполняете контракт - другому объекту может потребоваться прочитать это свойство / вызвать этот метод, и вы должны разрешить ему.

Интерфейс никогда не будет иметь private членов, так как интерфейс предназначен для "взаимодействия" между двумя объектами. Ваши внутренние private участники не имеют к этому никакого отношения, пока вы удерживаете конец контракта.

2 голосов
/ 08 июля 2010

Поскольку интерфейс не имеет модификатора доступа, если вы все еще хотите, чтобы ваш метод был закрытым в классе, реализующем этот интерфейс, вы можете реализовать этот интерфейс ЯДРО

Таким образом, ваши методы класса будут Private.

2 голосов
/ 08 июля 2010

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

Я знаю, что вы, наверное, слышали это миллион раз, ноИнтерфейс описывает, что делает объект, а класс - КАК он это делает.Класс IMPLEMENTS, интерфейс, он не наследует от него.

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

Имеет ли это смысл?

1 голос
/ 08 июля 2010

Интерфейсы хороши только для публичного доступа.Внутренне было бы странно для объекта ссылаться на себя через интерфейс.

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

1 голос
/ 08 июля 2010

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

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

Надеюсь, это поможет .. С уважением

0 голосов
/ 08 июля 2010

Подумайте немного об этом - и вы поймете, что это невозможно сделать:

Интерфейсы похожи на контакты.все открытые поля интерфейса являются частями контакта.

Таким образом, вы не можете скрыть их в подклассе ...
Что бы произошло, если бы кто-то выкинул объект вашего класса в интерфейстипа?

Возможно, вы захотите изменить свой дизайн - возможно, вы разделите ваш интерфейс на два интерфейса?или и интерфейс и абстрактный класс?нам нужно больше деталей, чтобы знать ...

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