Для чего нужны абстрактные классы

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. Преимущества использования абстрактных классов

Использование абстрактных классов дает следующие преимущества:

Источник

Абстрактные классы (C++)

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

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

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

Единственное различие между этим и предыдущим объявлениями состоит в том, что функция PrintBalance объявлена со спецификатором чисто виртуальной функции pure ( = 0 ).

Ограничения на использование абстрактных классов

Абстрактные классы нельзя использовать для:

переменных и данных членов;

типов возвращаемых функциями значений;

типов явных преобразований.

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

Определенные чистые виртуальные функции

Чистые виртуальные функции в абстрактных классах могут быть определеныили иметь реализацию. Вызывать эти функции можно только с помощью полного синтаксиса:

abstract — имя класса::Function-Name()

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

В примере показано, как расширение компилятора Майкрософт позволяет добавить встроенное определение в чистый виртуальный

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

base гарантирует, что для функции существует хотя бы определенная реализация. Без него компоновщик создает неразрешенную ошибку внешнего символа для неявного вызова.

В предыдущем примере чистая виртуальная функция base::

base вызывается неявно из derived::

Источник

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

1. Общий базовый класс

Сегодня просто день интересных тем. Помните ситуацию, когда мы ввели базовый класс ChessItem для упрощения всех классов шахматных фигур? Надеюсь, что да 🙂

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

Именно. Более того, создавать объекты типа ChessItem не имеет смысла. Это не фигура из шахмат, а всего лишь абстракция — класс, который мы сделали для удобства. Так работает абстракция из ООП : мы вынесли важные (общие для всех фигур) данные и методы в базовый класс, а их различия оставили в их классах.

2. Абстрактные классы

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Вот три вещи, которые стоит знать об абстрактных классах.

Метод без реализации

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

Запрет на создание объектов

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

КодОписание
Этот код не скомпилируется
А так можно

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

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

Если в классе есть хотя бы один нереализованный метод, объявленный прямо в нем или унаследованный от класса-родителя, класс считается абстрактным.

И зачем это все нужно? Зачем нужны абстрактные классы? Разве нельзя вместо них использовать обычные? А вместо абстрактных методов просто писать две скобочки в качестве тела метода – <>?

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

Преимущество этого подхода проявляется в больших проектах. Чем больше классов, тем чётче приходится очерчивать их роли. Вы увидите преимущество этого подхода, и уже в ближайшем будущем. Все через это проходят.

Источник

Для чего используют абстрактные классы?

Вот допустим шаблон кода, которым везде пытаются объяснить полезность абстрактных классов:

Так вот, в чем смысл использовать такую конструкцию, если можно сделать так:

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Все эти интерфейсы, абстрактные классы и т.д и т.п нужно тогда, когда над проектом работает несколько (много) человек, и проект чуть больше чем «свой мегакрутой бложик».

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Просто опишите в общем, подробностей не нужно.

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Полиморфизм типов часто применяется в php. Вот его суть на вашем примере:

Зачем это нужно?
Это нужно тогда, когда у вас может быть несколько реализаций одного и того же компонента. И вы точно знаете, что в будущем вам может понадобиться другая реализация. Например, представьте себе класс кеширования. Согласитесь, что кешировать можно в файл, можно в базу, можно в память и т.д. В таком случае, вы можете выделить абстракцию Cache с общим функционалом для любой реализации и создать наследников CacheFile, CacheMysql, CacheRedis и т.д.

Теперь когда вам понадобится компонент кеша, то вы можете внедрить его через параметр метода, который параметризирован типом Cache, если такому методу дать что-то другое, то интерпретатор кинет исключение. Вы же получаете гибкость. В любое время вы можете заменить реализацию компонента кеша на другой, просто передав в метод другой дочерний объект абстрактного класса Cache. Вы уже точно знаете, какой у него должен быть контракт и точно знаете, что вам не нужно вносить исправления в тот метод, который использует ваш класс Cache. Вы молодцы, ведь вы только что применили полиморфный принцип открытости/закрытости, одного из принципов SOLID а это значит, что ваш код стал чуть лучше.

Но, скорее всего, если вы ничего об этом не слышали, то вам следует обязательно познакомиться с Dependency injection container, который будет внедрять нужный компонент автоматически, вместо вас. Вы же лишь будете указывать в конфигах, какую именно реализацию компонента нужно подавать всему остальному коду. Тогда весь ваш проект сможет переезжать с CacheFile на CacheRedis и наоборот с помощью изменения всего одной строчки в конфиге.

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

Источник

ООП. Часть 6. Абстрактные классы и интерфейсы

Узнайте истинную мощь наследования и полиморфизма! Раскрываем секреты абстрактных классов и интерфейсов.

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

В предыдущей статье мы увидели, насколько удобнее становится ООП благодаря наследованию. Но оно может стать ещё лучше, если использовать абстрактные классы и интерфейсы.

Все статьи про ООП

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.

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

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

Это может понадобиться, чтобы объединить реализацию других схожих классов. Например, в вашей игре должны быть персонаж игрока и NPC (неигровые персонажи). У них могут быть общие свойства (имя, координаты) и методы (перемещение, изменение анимации).

Чтобы не повторять код несколько раз, можно вынести реализацию этих свойств и методов в абстрактный класс Character:

Тут всё как у обычных классов, но в конце можно заметить объявление свойства и метода без реализации. Реализация этих абстрактных свойств должна находиться в дочернем классе:

Когда объявляется реализация такого члена класса, необходимо указать ключевое слово override. Абстрактными могут быть следующие члены класса:

Дочерний класс должен реализовывать все члены родительского абстрактного класса, кроме тех случаев, когда дочерний класс тоже абстрактный.

В остальном всё очень похоже на обычные классы. Например, поле Y класса Character публичное, чтобы можно было использовать его в свойстве Y дочерних классов.

Для чего нужны абстрактные классы. Смотреть фото Для чего нужны абстрактные классы. Смотреть картинку Для чего нужны абстрактные классы. Картинка про Для чего нужны абстрактные классы. Фото Для чего нужны абстрактные классы

Абстрактный класс должен быть публичным.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *