2015-01-22 4 views
-1

Я не сделал OOP через некоторое время, поэтому я немного ржавый. Например, у меня есть клиент с подпиской на аренду и существует 3 типа подписки. Как я могу выбрать абстрактный класс и интерфейс для моего класса «Подписка»?Как выбирать между абстрактным классом и интерфейсом

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

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

+0

Все сводится к тому, как вы его видите. Ваш API только заботится о том, что какой-то объект является базовой концепцией «подписки» или он требует более тонкой детализации? В общем, я предпочитаю использовать интерфейсы, это позволяет мне определить базовый контракт, который, как ожидается, будет иметь любая реализация, и позволяет мне обобщать API для принятия рассматриваемого интерфейса, то есть я могу передать, какую реализацию я хочу, не подвергая реализация части API, которая просто не нужна. – MadProgrammer

+0

Абстрактный класс затем используется для обеспечения общих «базовых» реализаций, которые помогают уменьшить дублирование кода и помогают улучшить время, необходимое для создания пользовательских реализаций ... но это только я. Затем это поддерживает концепцию [«программа для интерфейса не для реализации»] (http://www.fatagnus.com/program-to-an-interface-not-an-implementation/) – MadProgrammer

ответ

1

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

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

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

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

Это просто эмпирические правила, но не правила, установленные в камне.

+0

спасибо за ваш ответ, он многое разъясняет мне :) – Lynct

0

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

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

+0

IMHO Я бы предпочел интерфейс сначала для описания основного договора «Подписка», это означает, что вы можете передать любой класс, который реализует интерфейс для всего API, без того, чтобы API вдруг принимал решения о том, какой тип подписки ему нужно обрабатывать. Вы можете использовать дополнительные интерфейсы, простирающиеся от этого, чтобы сузить его, если вам нужно. Затем вы использовали абстрактные классы для заполнения общего кода, что упростило бы разработку фактических реализаций и не привязывало вас к началу до предельного количества подписки ... но это только я – MadProgrammer

0

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

В вашем случае абстракция имеет смысл. Вы можете сохранить взаимные свойства в своем базовом классе и извлечь из него другие классы. Устраняет некоторый избыточный код.

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

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

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

* Если вы разрабатываете небольшие, краткие биты функциональности, используйте интерфейсы. Если вы разрабатываете большие функциональные единицы, используйте абстрактный класс.

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

https://msdn.microsoft.com/en-us/library/scsyfw1d(v=vs.71).aspx

+0

Не эти .Net рекомендации, а не Java? – RealSkeptic

+0

@RealSkeptic вы правы. Виноват. Но они довольно близки друг к другу с точки зрения терминологии. – KevinSP

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