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

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

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

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

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

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

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

Ответы

Ответ 1

  • Прочитайте статью статьи в википедии

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

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

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

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

class Doctor implements Comparable {..}

class Customer implements Comparable {..}

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

Ответ 2

  • Интерфейс - описание поведения
  • Класс - выполните поведение

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

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

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

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

Ответ 3

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

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

Посмотрите

Ответ 4

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

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

public class foo extends Person implements Man, Mammal

foo - Человек. Это также человек и млекопитающее;

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

И да, и Docor, и Customer/Patient могут реализовать или расширить Person.

Ответ 7

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

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

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

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

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

Ответ 8

В С# множественное наследование может быть достигнуто только через интерфейс. Если вы хотите, чтобы ваш класс нуждался в множественном наследовании, идущем fwd, тогда используйте интерфейс else use class.

Также всем членам интерфейсов должно быть присвоено задание в классе i.e. Члены интерфейса должны быть реализованы членами.

Ответ 9

Класс

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

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

Ответ 10

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

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