Класс против интерфейса - PullRequest
       1

Класс против интерфейса

13 голосов
/ 16 февраля 2010

У меня есть довольно простой вопрос:

Когда мы решим использовать интерфейс или класс для определенного класса?

Например: говорит, что у нас есть 2 класса, Клиент и Доктор.

В Inheritance (классе): мы могли бы установить эти 2 класса для наследования от родительского класса Person.

Не могли бы мы сделать то же самое с интерфейсом? Говорит, что у нас есть InterfacePerson, и заказчик и Доктор реализуют интерфейс?

Таким образом, это приводит к: когда мы решим использовать один над другим и наоборот?

Ответы [ 10 ]

14 голосов
/ 16 февраля 2010
  • Прочтите статью в Википедии

  • Прочитайте книгу, затем снова прочитайте главы об ООП

  • В вашем примере Person должен быть классом, поскольку он содержит подробности реализации , общие для Doctor и Customer.

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

Давайте рассмотрим простой пример - есть интерфейсы Comparable (по крайней мере, в Java). Это обозначает , что его разработчики можно сравнивать друг с другом. Таким образом, вы можете иметь два класса:

class Doctor implements Comparable {..}

class Customer implements Comparable {..}

Теперь вы можете использовать общий метод, который принимает любой набор объектов , которые реализуют Comparable и вызывают comparable1.compareTo(comparable2), потому что вы знаете, они могут выполнить сравнение - это обозначается их интерфейсом .

11 голосов
/ 17 февраля 2010
  • Интерфейс - опишите поведение
  • Класс - сделать поведение

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

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

Итак, реальный ответ, это зависит от вашего дизайна.

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

10 голосов
/ 16 февраля 2010

Интерфейсы используются для реализации определенных методов / свойств.В двух словах, интерфейс - это набор правил.

Класс может использоваться для наследования / переопределения базовой функциональности.

Посмотрите на

2 голосов
/ 31 января 2016

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

Таким образом, из трех вариантов вы обсуждаете два неправильных: наследование и интерфейсы для моделирования партий и ролей.

Класс - это шаблон для набора объектов. Эти объекты имеют поведение, (и, как правило,) состояние и характеристики. Что касается поведения, каждый объект имеет (неявный) интерфейс уже : набор методов, которые могут вызываться извне.

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

  1. Кто-то хочет представить подмножество поведения, поэтому различные классы объектов могут быть обработаны полиморфно.
  2. Один хочет ограничить возможное поведение объекта, выставленного другому, подмножеством его (неявного) интерфейса, потому что объект действует в другом контексте.
2 голосов
/ 16 февраля 2010

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

Во-вторых, класс может расширять только ОДИН класс. Интерфейсы не ограничены этим, и поэтому мы можем иметь множественное наследование, например,

public class foo extends Person implements Man, Mammal

фу это человек. Это также Человек и Млекопитающее;

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

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

1 голос
/ 16 февраля 2010

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

Но Интерфейс - это контракт, который указывает имплантации, если он не является абстрактным классом.

И одно важное различие между классом и интерфейсом состоит в том, что

наследование классов даст связь между двумя общими подклассами.

Где как реализация интерфейса дает связь между двумя необычными классами.

1 голос
/ 16 февраля 2010

Проще говоря, вы используете классы, когда задействован код / ​​реализация, и интерфейсы, когда это просто описания интерфейсов. Когда вы ссылаетесь на объекты в вашем коде, предпочитайте ссылаться на интерфейсы, так как это облегчает замену фактической реализации (или добавляет больше и разные реализации).

И да, и Docor, и Клиент / Пациент могут внедрить или продлить Person.

0 голосов
/ 16 февраля 2010

Думайте об интерфейсе как о контракте. Класс может зафиксировать контракт (реализовать интерфейс)

Предположим, у вас есть класс Person с подклассами Doctor и Patient. Тогда у вас будет интерфейс Treatable с методом getSymptoms (), реализованным Patient, и интерфейс Teating с методом лечения (Treatable), реализованным Doctor. Скорее всего, cure (Treatable) в какой-то момент вызовет getSymptoms () ...

0 голосов
/ 16 февраля 2010

класс предполагает, что объект, который наследует базовый класс, является своего рода этим классом

если вы используете интерфейс, это только показывает, что ваш класс имеет некоторое общее поведение, которое интерфейс описывает

0 голосов
/ 16 февраля 2010

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

Кроме того, все члены Интерфейсов должны быть определены в классе, т.е. члены интерфейса должны быть реализованы.

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