Что может содержать в себе абстрактный класс
25. Java – Абстракция: абстрактный класс и метод, наследование абстрактного класса
Абстракция — это качество общения с идеями, а не с событиями. Например, в случае с e-mail, подробные детали о происходящем во время отправки e-mail, используемый протокол сервером e-mail – всё это скрыто от пользователя. Тем не менее, для отправки e-mail вам достаточно напечатать содержимое, адрес получателя и нажать «отправить».
Так и в объектно-ориентированном программировании: абстракция – это процесс скрытия деталей реализации от пользователя, предоставляя ему только функционал. Иными словами, пользователь будет владеть информацией о том, что объект делает, а не как он это делает.
В Java абстракция достигается с использованием абстрактных классов и интерфейсов.
Содержание
Абстрактный класс
Класс, который во время объявления содержит в себе ключевое слово abstract, известен как абстрактный класс.
Пример
Эта глава показывает вам пример абстрактного класса. Чтобы создать абстрактный класс, просто используйте ключевое слово abstract перед ключевым словом class во время объявления класса.
Вы можете наблюдать, что помимо абстрактных методов класс Employee такой же, как и обычный класс в Java. Класс теперь абстрактный, но он всё ещё имеет три поля, семь методов и один конструктор.
Теперь попробуйте создать экземпляр класса Employee следующим образом:
При попытке компиляции вышеприведённого класса вы получите следующую ошибку:
Наследование абстрактного класса
Рассмотрим наследоавние абстрактного класса в Java на примере. Вы можете наследовать класс Employee, как конкретный класс, следующим образом:
Пример
Здесь вы не можете создать экземпляр класса Employee, но вы можете создать экземпляр класса Salary, используя который вы сможете получить доступ ко всем трём полям и семи методам класса Employee, как в примере ниже.
После запуска программы будет выдан такой результат:
Абстрактный метод
Если вы хотите, чтобы класс содержал конкретный метод, но вы желаете, чтобы фактическая реализация этого метода определялась дочерними классами, вы можете объявить метод в родительском классе как абстрактный
Рассмотрим пример абстрактного метода в Java.
Пример
Объявление метода абстрактным ведёт к двум последствиям:
Примечание. В конце концов, класс-потомок должен реализовать абстрактный метод, иначе у вас будет иерархия абстрактных классов, экземпляры которых нельзя будет создать.
ООП. Часть 6. Абстрактные классы и интерфейсы
Узнайте истинную мощь наследования и полиморфизма! Раскрываем секреты абстрактных классов и интерфейсов.
В предыдущей статье мы увидели, насколько удобнее становится ООП благодаря наследованию. Но оно может стать ещё лучше, если использовать абстрактные классы и интерфейсы.
Все статьи про ООП
Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Абстрактные классы
Особенность абстрактных классов в том, что их можно использовать только как родительский класс, то есть вы не можете создать объект. Для их объявления используется ключевое слово abstract.
Это может понадобиться, чтобы объединить реализацию других схожих классов. Например, в вашей игре должны быть персонаж игрока и NPC (неигровые персонажи). У них могут быть общие свойства (имя, координаты) и методы (перемещение, изменение анимации).
Чтобы не повторять код несколько раз, можно вынести реализацию этих свойств и методов в абстрактный класс Character:
Тут всё как у обычных классов, но в конце можно заметить объявление свойства и метода без реализации. Реализация этих абстрактных свойств должна находиться в дочернем классе:
Когда объявляется реализация такого члена класса, необходимо указать ключевое слово override. Абстрактными могут быть следующие члены класса:
Дочерний класс должен реализовывать все члены родительского абстрактного класса, кроме тех случаев, когда дочерний класс тоже абстрактный.
В остальном всё очень похоже на обычные классы. Например, поле Y класса Character публичное, чтобы можно было использовать его в свойстве Y дочерних классов.
Абстрактный класс должен быть публичным.
Абстрактные классы (C++)
Абстрактные классы используются в качестве обобщенных концепций, на основе которых можно создавать более конкретные производные классы. Нельзя создать объект типа абстрактного класса. Однако можно использовать указатели и ссылки на абстрактные типы классов.
Абстрактный класс создается путем объявления по крайней мере одной чистой виртуальной функции члена. Это виртуальная функция, объявленная с помощью синтаксиса чистого описателя ( = 0 ). Классы, производные от абстрактного класса, должны реализовывать чисто виртуальную функцию; в противном случае они также будут абстрактными.
Рассмотрим пример, представленный в виртуальных функциях. Класс Account создан для того, чтобы предоставлять общие функции, но объекты типа Account имеют слишком общий характер для практического применения. Это означает Account хороший кандидат для абстрактного класса:
Единственное различие между этим и предыдущим объявлениями состоит в том, что функция PrintBalance объявлена со спецификатором чисто виртуальной функции pure ( = 0 ).
Ограничения на использование абстрактных классов
Абстрактные классы нельзя использовать для:
переменных и данных членов;
типов возвращаемых функциями значений;
типов явных преобразований.
Если конструктор абстрактного класса вызывает чисто виртуальную функцию, прямо или косвенно, результат не определен. Однако конструкторы и деструкторы абстрактных классов могут вызывать другие функции-члены.
Определенные чистые виртуальные функции
Чистые виртуальные функции в абстрактных классах могут быть определены или иметь реализацию. Вызывать эти функции можно только с помощью полного синтаксиса:
abstract — имя класса::Function-Name()
Определенные чистые виртуальные функции полезны при проектировании иерархий классов, базовые классы которых содержат чистые виртуальные деструкторы. Это обусловлено тем, что деструкторы базового класса всегда вызываются во время уничтожения объекта. Рассмотрим следующий пример.
В примере показано, как расширение компилятора Майкрософт позволяет добавить встроенное определение в чистый виртуальный
Когда объект aDerived выходит из области действия, derived вызывается деструктор класса. Компилятор создает код для неявного вызова деструктора класса base после derived деструктора. Пустая реализация чисто виртуальной функции
base гарантирует, что для функции существует хотя бы определенная реализация. Без него компоновщик создает неразрешенную ошибку внешнего символа для неявного вызова.
В предыдущем примере чистая виртуальная функция base::
base вызывается неявно из derived::
BestProg
Содержание
Поиск на других ресурсах:
1. Что такое абстрактный класс? Назначение абстрактных классов. Общая форма. Ключевое слово abstract
Абстрактный класс – это класс, содержащий методы, которые не имеют реализации. Абстрактный класс создается с целью создания общего интерфейса между разными реализациями классов, которые будут производными от абстрактного класса. Абстрактный класс создается для определения некоторых общих черт производных от него классов, которые определяют конкретную его реализацию.
Запрещено (нет смысла) создавать объект абстрактного класса.
Общая форма объявления абстрактного класса следующая:
2. Что такое абстрактный метод? Общая форма
Если некоторый класс есть унаследованным от абстрактного, то этот класс должен переопределить все абстрактные методы базового абстрактного класса. В противном случае будет сгенерирована ошибка.
Общая форма объявления абстрактного метода в абстрактном классе имеет следующий вид:
В иерархии наследования (расширения) классов, абстрактные методы являются чем-то общим. Конкретные реализации абстрактных методов помещаются классах, унаследованных от абстрактных классов.
3. Схематическое изображение объявления и использования абстрактного метода в абстрактном классе. Пример
Рисунок. Схема взаимодействия между абстрактным классом и производными классами в Java
4. Пример, который демонстрирует использование абстрактных классов
В классе Figure объявляются:
В классе Triangle() реализованы:
В результате выполнения функции main() класса UseAbstractClass будет выведен следующий результат:
5. Объяснение к примеру из пункта 4
Объяснение к примеру (см. предшествующий пункт) в виде вопросов.
5.1. Зачем в классе Figure методы Area() и ShowName() объявляются абстрактными?
5.2. Почему класс Figure объявляется абстрактным?
5.3. Почему в классе Figure методы Area() и ShowName() не содержат кода реализации (тела метода)?
Если в абстрактном классе метод объявлен как абстрактный (с ключевым словом abstract ), то этот метод не должен содержать реализации (согласно синтаксису Java). Это поясняется тем, что вызов этого метода не имеет смысла.
5.4. Можно ли в абстрактном классе Figure добавлять другие не абстрактные методы?
Да, можно. Абстрактный класс может содержать не абстрактные методы (в отличие от интерфейса ).
Нет, нельзя. То есть, следующая строка
есть ошибкой компилятора Java: «Cannot instantiate the type Figure».
Метод GetArea() получает ссылку с именем f абстрактного класса Figure, который есть базовым в иерархии классов (из класса Figure унаследованы два класса Triangle и Circle).
Затем по ссылке вызывается метод Area() в строке
В функции main() при вызове метода GetArea()
Точно таким же способом связывается экземпляр f2 класса Circle с обобщенной ссылкой f в методе GetArea()
6. Можно ли в абстрактном классе объявлять методы, которые имеют реализацию (тело)?
Да, можно. Абстрактный класс допускает реализацию не абстрактных методов.
7. Пример создания иерархии абстрактных классов
Пример. Ниже приведен пример иерархии абстрактных классов
Использование класса C может быть, например следующим
8. Может ли абстрактный класс не содержать абстрактных методов?
Да, может. Это необходимо в случаях, когда абстрактные методы в классе не нужны, но нужно запретить создание экземпляров этого класса.
9. Какие отличия между использованием абстрактных классов и использованием интерфейсов?
Между абстрактными классами и интерфейсами существуют следующие отличия:
10. Преимущества использования абстрактных классов
Использование абстрактных классов дает следующие преимущества:
Абстрактные классы
Абстрактные классы — это классы, которые оставляют некоторые или все элементы нереализованными, чтобы реализации могли предоставляться производными классами.
Синтаксис
Remarks
В объектно-ориентированном программировании абстрактный класс используется в качестве базового класса иерархии и представляет общие функциональные возможности различных наборов типов объектов. Как предполагает имя «abstract», абстрактные классы часто не соответствуют конкретным сущностям в области, в которой возникла проблема. Однако они показывают, сколько различных конкретных сущностей встречается чаще всего.
Как и в случае с другими типами, абстрактные классы могут иметь базовый класс и один или несколько базовых интерфейсов. Каждый базовый класс или интерфейс отображается в отдельной строке вместе с inherit ключевым словом.
В следующем коде показана абстрактная фигура класса, которая имеет два неабстрактных производных класса: квадратные и круговые. В примере показано, как использовать абстрактные классы, методы и свойства. В примере фигура абстрактного класса представляет общие элементы конкретных сущностей Circle и Square. Общие функции всех фигур (в двухмерной системе координат) являются абстрактными в классе Shape: положение в сетке, угол поворота, а также свойства области и периметра. Они могут быть переопределены, за исключением расположения, поведения отдельных фигур, которые не могут изменяться.
Метод вращения можно переопределить, как в классе Circle, который является неизменяемым в связи с его симметрией. Поэтому в классе Circle метод вращения заменяется методом, который ничего не делает.