8 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Абстрактные классы и методы

25. Java – Абстракция: абстрактный класс и метод, наследование абстрактного класса

Абстракция — это качество общения с идеями, а не с событиями. Например, в случае с e-mail, подробные детали о происходящем во время отправки e-mail, используемый протокол сервером e-mail – всё это скрыто от пользователя. Тем не менее, для отправки e-mail вам достаточно напечатать содержимое, адрес получателя и нажать «отправить».

Так и в объектно-ориентированном программировании: абстракция – это процесс скрытия деталей реализации от пользователя, предоставляя ему только функционал. Иными словами, пользователь будет владеть информацией о том, что объект делает, а не как он это делает.

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

Содержание

Абстрактный класс

Класс, который во время объявления содержит в себе ключевое слово abstract, известен как абстрактный класс.

  • Абстрактные классы в Java могут содержать или не содержать абстрактные методы, т.е. методы без тела (public void get();)
  • Если класс имеет хотя бы один абстрактный метод, то класс должен быть объявлен абстрактным.
  • Если класс объявлен абстрактным, его нельзя реализовать.
  • Чтобы использовать абстрактный класс, вам нужно наследовать его из другого класса, обеспечить реализацию абстрактных методов в нём.
  • Если вы наследуете абстрактный класс в Java, вам нужно обеспечить реализацию всех абстрактных методов в нём.

Пример

Эта глава показывает вам пример абстрактного класса. Чтобы создать абстрактный класс, просто используйте ключевое слово abstract перед ключевым словом class во время объявления класса.

Вы можете наблюдать, что помимо абстрактных методов класс Employee такой же, как и обычный класс в Java. Класс теперь абстрактный, но он всё ещё имеет три поля, семь методов и один конструктор.

Теперь попробуйте создать экземпляр класса Employee следующим образом:

При попытке компиляции вышеприведённого класса вы получите следующую ошибку:

Наследование абстрактного класса

Рассмотрим наследоавние абстрактного класса в Java на примере. Вы можете наследовать класс Employee, как конкретный класс, следующим образом:

Пример

Здесь вы не можете создать экземпляр класса Employee, но вы можете создать экземпляр класса Salary, используя который вы сможете получить доступ ко всем трём полям и семи методам класса Employee, как в примере ниже.

Читать еще:  Как восстановить переписку в Телеграмме – существует ли действенный метод

После запуска программы будет выдан такой результат:

Абстрактный метод

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

  • Ключевое слово abstract используется для объявления метода абстрактным.
  • Вам нужно разместить ключевое слово abstract перед именем метода во время его объявления.
  • Абстрактный метод в Java содержит сигнатуру метода, но не содержит тела метода.
  • Вместо фигурных скобок у абстрактного метода будет точка с запятой (;) на конце.

Рассмотрим пример абстрактного метода в Java.

Пример

Объявление метода абстрактным ведёт к двум последствиям:

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

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

Предположим, что класс Salary наследует класс Employee, тогда он должен реализовать метод computePay() , как показано ниже:

Абстрактные базовые классы (ABC)

Редакция Кодкампа

Введение

Примеры

Установка метакласса ABCMeta

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

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

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

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

Читать еще:  Деление жесткого диска на разделы с помощью бесплатной программы AOMEI Partition Assistant

Теперь можно просто создать подкласс и переопределить:

Почему / Как использовать ABCMeta и @abstractmethod

Абстрактные базовые классы (ABC) определяют, какие производные классы реализуют конкретные методы из базового класса.

Чтобы понять, как это работает и почему мы должны его использовать, давайте рассмотрим пример, который понравился бы Ван Россуму. Допустим, у нас есть базовый класс «MontyPython» с двумя методами (joke & punchline), который должен быть реализован всеми производными классами.

Когда мы создаем объект и называем это два метода, мы получим ошибку (как и ожидалось) с punchline() метод.

Однако это все еще позволяет нам создавать экземпляр объекта класса ArgumentClinic без получения ошибки. На самом деле мы не получим ошибку, пока не найдем punchline ().

Этого можно избежать, используя модуль Abstract Base Class (ABC). Давайте посмотрим, как это работает на том же примере:

На этот раз, когда мы пытаемся создать экземпляр объекта из неполного класса, мы немедленно получаем TypeError!

В этом случае легко завершить класс, чтобы избежать любых ошибок типа:

На этот раз, когда вы создаете экземпляр объекта, он работает!

Синтаксис

Параметры

Примечания

Научим основам Python и Data Science на практике

Это не обычный теоритический курс, а онлайн-тренажер, с практикой на примерах рабочих задач, в котором вы можете учиться в любое удобное время 24/7. Вы получите реальный опыт, разрабатывая качественный код и анализируя реальные данные.

Абстрактные классы, методы и свойства

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

Абстрактный класс

Абстрактный класс объявляется с ключевым словом abstract. Такой класс имеет свои правила:
1) нельзя создавать экземпляры (объекты) абстрактного класса;
2) абстрактный класс может содержать как абстрактные методы/свойства, так и обычные;
3) в классе-наследнике должны быть реализованы все абстрактные методы и свойства, объявленные в базовом классе.

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

Читать еще:  10 сервисов оптимизации изображений онлайн

В отличие от языка C++, в C# множественное наследование не допускается. Однако добавить функциональность в классы-наследники можно через механизм интерфейсов.

Абстрактные методы

Абстрактный метод – это метод, который не имеет своей реализации в базовом классе, но он должен быть реализован в классе-наследнике. Абстрактный метод может быть объявлен только в абстрактном классе.

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

[модификатор доступа] abstract [тип] [имя метода] ([аргументы]);

Реализация абстрактного метода в классе-наследнике происходит так же, как и переопределение метода, при помощи ключевого слова override:

[модификатор доступа] override [тип] [имя метода] ([аргументы])
<
// реализация метода
>

Абстрактные свойства

Создание абстрактных свойств не сильно отличается от методов:

protected [тип] [поле, которым управляет свойство];
[модификатор доступа] abstract [тип] [имя свойства]

Реализация в классе-наследнике:

Пример «Правильный многоугольник»

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

где Length, Area, Perimeter – длина стороны, площадь и периметр многоугольника;
Figure( ) и InfoFigure( )– конструктор класса и обычный (не абстрактный) метод класса;
area( ) и perimeter( ) – абстрактные методы класса, в конструкторе они используются для нахождения полей класса Area и Perimeter.

Наследуем от абстрактного класса Figure класс Square («Квадрат»):

В этом классе производится перегрузка конструктора Square( ), наследуемого от конструктора базового (base) класса Figure( ) – дополнительно вызываются методы area( ) и perimeter( ), которые конкретизируются далее.

Аналогично наследуем от абстрактного класса Figure класс Triangle («Треугольник»):

и класс Circle («Окружность» — задается диаметр):

Как мы видим, добавление нового n-угольника сводится к объявлению класса-наследника и определению абстрактных методов определения площади и периметра многоугольника.

В классе Program( ) создадим соответствующие объекты и вызовем методы классов-наследников:

Для тренировки добавьте класс Hexagon («Шестиугольник»), сравните полученные результаты с кругом.

Другая реализация принципа полиморфизма предполагает использование интерфейсов.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: