Преимущество наличия абстрактного класса для реализации интерфейса? - PullRequest
4 голосов
/ 29 сентября 2011

Я недавно задал этот вопрос о том, следует ли мне реализовывать интерфейсы или абстрактные классы. Скотт дал ответ, предлагая использовать оба, но я все еще не уверен, почему я хотел бы сделать это. Есть ли польза в долгосрочной перспективе? Каковы преимущества такого подхода?

Вот некоторые преимущества, которые я думаю:

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

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

Ответы [ 3 ]

6 голосов
/ 29 сентября 2011

Этот подход дает вам лучшее из обоих миров - гибкость интерфейсов с полезной опцией базового класса.

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

Но, дополнительно предлагая абстрактный базовый класс, вы можете дать им «ногу вверх», возможно, путем реализации некоторой вспомогательной функциональности, которая, вероятно, является общим требованием для большинства реализаций вашего интерфейса - для Например, это можно сделать с помощью шаблона Template Method.

В самой .NET Framework есть несколько примеров раскрытия как интерфейса, так и базового класса. Например System.ComponentModel.IComponent и System.ComponentModel.Component

Вот еще один вопрос. Если я реализую интерфейс, должен ли интерфейс содержит только методы, которые могут делать все подклассы?

Да. Вы по сути описываете Принцип разделения интерфейса .

2 голосов
/ 29 сентября 2011

Интерфейс будет определять контракт.Любой реализатор (напрямую или через абстрактный реализатор) будет соответствовать этому контракту.

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

1 голос
/ 29 сентября 2011

Я предполагаю, что C # здесь, потому что у другого вопроса был тег C #

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

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

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

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

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

Надеюсь, это имеет смысл:)

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