2010-04-12 2 views
0

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

ответ

2

Основные отличия от точки зрения дизайна является то, что:

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

Так что я бы сказал, что вы правы в утверждении, что «абстрактный класс абстрагируется реализацию поведения, а интерфейс абстрагирует тип, который реализует поведение»

Абстрактный класс: обеспечивает требование реализации некоторые методы (вы переопределить методы абстрактного класса)

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

Например:

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

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

+0

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

4

Абстрактный класс может (и обычно делает) обеспечить некоторую реализацию.

И интерфейс не может обеспечить реализацию.

+0

+1. Однако в некоторых языках (C++) просто нет «интерфейса», и, следовательно, более вероятен абстрактный класс, который не обеспечивает никакой реализации. – ereOn

+2

@ereOn - поскольку OP упоминает интерфейсы, нужно предположить, что он использует язык, который их имеет;) – Oded

0

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

0

Как правило, абстрактный класс реализует какое-то поведение, но оставляет нерешенным некоторое специализированное поведение.

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

class MyServer(Networkserver): 
    // process() is called whenever a client has sent a request 
    function process(data): 
     ... 

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

0

Интерфейс = чистый абстрактный класс (абстрактный класс, без реализации)

0

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

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

an interview with Erich Gamma, в котором он обсуждает некоторые отличия.

Чтобы ответить на ваш вопрос, я думаю, что это имеет смысл с теоретической точки зрения. С практической точки зрения, это, вероятно, зависит от того, на каком языке вы программируете :)

+0

Я искал ответ, который поддерживает мой аргумент «Различные иерархии (семейства) объектов могут реализовать один и тот же интерфейс, но они не может иметь такой же абстрактный базовый класс ». Поэтому я верил, что «абстрактный класс абстрагирует реализацию поведения, а интерфейс абстрагирует тип, реализующий поведение» – somaraj

0

Оба имеют конкретные виды использования в соответствии с классом абстрактного языка, который предназначен для базового класса и не может быть создан. Тогда как, когда и нужно определить только контракт (NO реализации), который каждый класс реализации должен следовать thrie своему, то и должны использовать interfaces.Also -

Может быть базовый класс для наследования

абстрактного класса - да Интерфейс - нет

Может иметь impelementation

абстрактный класс - да Интерфейс -не

Смежные вопросы