Подтвердить что ты не робот

Абстрактный класс расширяет конкретный класс

Я раньше узнал, что абстрактный класс может расширить конкретный класс. Хотя я не вижу причины для разработчиков JAVA, но все в порядке. Я также узнал, что абстрактный класс, который расширяет конкретный класс, может сделать абстрактные абстрактные методы. Зачем? Можете ли вы предоставить пример использования, где это полезно? Я пытаюсь изучить шаблоны дизайна, и я не хочу ничего пропустить.

Вот пример:

public class Foo 
{
    public void test()
    {
    }
}

public abstract class Bar extends Foo
{
   @Override
   public abstract void test();
}
4b9b3361

Ответ 1

Это становится полезным, если у меня есть набор классов, для которых я хочу реализовать по умолчанию test() для (так что они могут простираться от Foo) и подмножество тех классов, которые я хочу заставить предоставить свои собственные реализация (и в этом случае сделать ее абстрактной в подклассе обеспечит это.)

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

Ответ 2

В основном выборочно повторно использовать какой-то существующий (устаревший?) код.

Например: Предположим, что кто-то уже создал конкретный класс-C (конечно, полную реализацию).

Теперь, поскольку вы разрабатываете новую систему (которая имеет абстрактный класс-A), и вы проанализировали существующую систему и обнаружили, что у вас будут некоторые методы, которые почти аналогичны методы specific-class-C. Но вы также обнаружили, что некоторые методы конкретного класса-C слишком специфичны, и вы хотите обеспечить реализацию этих методов в конкретных подклассах абстрактного класса-A.

Таким образом, он позволяет выборочно выбирать, какие методы использовать повторно и что не использовать повторно.

Ответ 3

Чтобы сделать класс, который расширил ваш класс (сделал абстрактным), чтобы обеспечить конкретный тип реализации.

Например:

  • abstract ClassA
  • ClassB расширяет ClassB - обеспечивает конкретную реализацию абстрактных методов, определенных в ClassA

Ответ 4

Если вы создадите абстракцию метода test, это заставляет любого, получающего из класса Bar, обеспечить реализацию метода.

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

Ответ 5

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

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

Теперь требования меняются. Мы должны писать классы для чтения файлов docx, ppt и даже xsl файлов.

Класс MSDocReader содержит методы, которые можно повторно использовать, такие как получение размера файла в КБ, onnecting в .Net framework (если я не ошибаюсь: -))

Теперь, используя это условие, мы можем написать класс абстракции AbstractMSFileReader, который будет содержать все методы, которые используются в MSDocReader. Но этот класс будет иметь метод чтения как абстрактный.

Причина, по которой мы хотим заставить разработчиков использовать собственную версию метода чтения. (Мы не должны использовать наследование, поскольку наследование ясно указывает, что метод подкласса расширяет функциональность родительского метода. Чтение файла документа и чтение файла excel - это две разные вещи, и они не попадают под той же иерархии. )

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