Как Вы решаете между использованием Абстрактного класса и Интерфейсом? [дубликат]

Вы можете попробовать:

int length = word.length();
IntStream.range(0, length).forEach(i -> System.out.println(word.substring(0, length - i)));

Или

IntStream.range(0, length).mapToObj(i -> word.substring(0, length - i)).forEach(System.out::println);

Он использует Java stream и очень лаконичен.

17
задан Community 23 May 2017 в 12:26
поделиться

3 ответа

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

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

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

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

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

Как @tvanfosson примечания, это не плохая идея использовать много интерфейсов, когда Вы действительно понимаете абстрактные классы и интерфейсы, это не действительно альтернативная ситуация. Конкретная ситуация могла использовать и абстрактные классы и интерфейсы или ни одного. Мне нравится использовать интерфейсы иногда просто для ограничения то, к чему метод или объект могут получить доступ на переданном в объекте параметра.

33
ответ дан 30 November 2019 в 11:38
поделиться

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

3
ответ дан 30 November 2019 в 11:38
поделиться

Как @m4bwav примечания, главная разница - то, что абстрактный класс, и часто делает, может обеспечить реализацию по умолчанию по крайней мере для некоторых методов. Это позволяет Вам использовать абстрактный класс для хранения кода DRY (не повторяйте себя), путем сохранения кода характерным для всех классов, которые наследовались абстрактному классу в самом абстрактном классе.

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

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

2
ответ дан 30 November 2019 в 11:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: