Является ли целью интерфейса скрыть информацию? - PullRequest
1 голос
/ 11 января 2011

Учитывая, что интерфейсы также используются, чтобы помочь скрыть информацию, предоставляя пользователю только подмножество возможных методов, которые ему разрешено использовать, и, скажем, у меня есть Person класс и интерфейс IPerson.

Теперь в основном, я могу сделать

IPerson testy = new Person();

или

Person testy = new Person();

Так что на самом деле я не ограничен в использовании Person до сих пор. Так как же интерфейс действительно скрывает данные?

Ответы [ 4 ]

5 голосов
/ 11 января 2011

Интерфейсы не используются, чтобы «спрятать» что-либо само по себе. Он используется для установления договора между вызывающей стороной и реализацией. Этот контракт обещает, что «эти методы и свойства будут здесь, и они не изменятся».

Интерфейсы также открывают прекрасную возможность варьировать реализацию без необходимости иметь дело с вызывающим абонентом. Это важно в отделенных проектах.

Ваш вопрос подразумевает, что ваш main хочет, чтобы знал все о классе Person. То, что вы на самом деле получаете, - это связанный код, который сложнее протестировать. Чтобы «исправить» это, вы должны изменить свое мышление и подумать: main делать не хотите, чтобы знал все о Person, он интересуется только IPerson и требует только интерфейса. Не больше, не меньше.

4 голосов
/ 11 января 2011

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

Это также называется «инкапсуляцией», и преимущество в том, чтоРазработчик может изменить внутренние механизмы объекта, не нарушая существующий код, который был написан вокруг его открытого интерфейса, что облегчает изменение вещей.Таким образом, вы часто будете слышать интерфейсы, описываемые как «контракт», потому что он создает неявное соглашение между пользователями и разработчиками класса о том, что его методы, обращенные вперед, будут оставаться согласованными.И поскольку несколько классов могут реализовывать один интерфейс, один компонент может быть легко заменен другим, если он реализует один и тот же открытый интерфейс.Грэди Буч, автор уважаемой книги по объектно-ориентированному дизайну, определяет инкапсуляцию следующим образом:

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

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

Итак, возвращаясь к примеру, приведенному в вашем вопросе, вы не должны быть ограничены.от использования класса Person, но вы можете быть ограничены в методах, предоставляемых этим классом, к которым у вас есть доступ.Например, класс Person может хранить имена людей внутри себя в отдельных полях FirstName и LastName, но только публично раскрывать одно свойство Name, которое возвращает объединение обоих этих полей частных имен.

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

3 голосов
/ 11 января 2011

Что делать, если у вас нет этого Person класса.

 Object obj = loadObject();

 if(obj is IPerson) {

  IPerson person = (IPerson) obj;

 } 

или

  IPerson person = loadPerson();
0 голосов
/ 18 января 2011

Фундаментальная цель интерфейсов в .net, которая не может быть реализована другими способами, заключается в предоставлении ограниченной формы множественного наследования.Наличие класса, наследуемого от другого класса, служит двум ортогональным целям:

  1. Это означает, что производные классы могут использовать поля, методы и свойства базового класса, которые будут адекватно обслуживать потребности производного класса.класс без необходимости уточнения.
  2. Это означает, что код, который ожидает методы базового класса, может автоматически работать с методами производного класса.

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

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

...