Что такое абстрактный класс и зачем он нужен

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

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

Что такое абстрактный класс и зачем он нужен. Смотреть фото Что такое абстрактный класс и зачем он нужен. Смотреть картинку Что такое абстрактный класс и зачем он нужен. Картинка про Что такое абстрактный класс и зачем он нужен. Фото Что такое абстрактный класс и зачем он нужен

Что такое абстрактный класс и зачем он нужен. Смотреть фото Что такое абстрактный класс и зачем он нужен. Смотреть картинку Что такое абстрактный класс и зачем он нужен. Картинка про Что такое абстрактный класс и зачем он нужен. Фото Что такое абстрактный класс и зачем он нужен

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

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

Что такое абстрактный класс и зачем он нужен. Смотреть фото Что такое абстрактный класс и зачем он нужен. Смотреть картинку Что такое абстрактный класс и зачем он нужен. Картинка про Что такое абстрактный класс и зачем он нужен. Фото Что такое абстрактный класс и зачем он нужен

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

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

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

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

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

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

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

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

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

Что такое абстрактный класс и зачем он нужен. Смотреть фото Что такое абстрактный класс и зачем он нужен. Смотреть картинку Что такое абстрактный класс и зачем он нужен. Картинка про Что такое абстрактный класс и зачем он нужен. Фото Что такое абстрактный класс и зачем он нужен

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

Источник

Абстрактные и запечатанные классы и члены классов (Руководство по программированию на C#)

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

Ключевое слово sealed позволяет предотвратить наследование класса или определенных членов класса, помеченных ранее как virtual.

Абстрактные классы и члены классов

Классы могут быть объявлены абстрактными путем помещения ключевого слова abstract перед определением класса. Пример:

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

Абстрактные методы не имеют реализации, поэтому определение такого метода заканчивается точкой с запятой вместо обычного блока метода. Классы, производные от абстрактного класса, должны реализовывать все абстрактные методы. Если абстрактный класс наследует виртуальный метод из базового класса, абстрактный класс может переопределить виртуальный метод с помощью абстрактного метода. Пример:

Запечатанные классы и члены классов

Классы могут быть объявлены как запечатанные путем помещения ключевого слова sealed перед определением класса. Пример:

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

Источник

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

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

Источник

Абстрактный класс: определение, назначение и отличия от интерфейса С

Что такое абстрактный класс и зачем он нужен. Смотреть фото Что такое абстрактный класс и зачем он нужен. Смотреть картинку Что такое абстрактный класс и зачем он нужен. Картинка про Что такое абстрактный класс и зачем он нужен. Фото Что такое абстрактный класс и зачем он нужен

Абстрактный класс — это один из принципов объектно-ориентированного программирования. Его используют в языках, которые поддерживают ООП, например :

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

Интерфейс и абстрактный класс в С

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

Когда нужно применять абстрактный класс в С:

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

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

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

Когда нужно применять интерфейс в С:

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

Когда проектируется небольшой тип объектов со схожим функционалом.

Интерфейс и абстрактный класс в С: пример

Представим ситуацию, что у вас есть собственная транспортная система, которая состоит из:

public abstract class WheeledTransport

public abstract void Move();

public class PassengerCar : WheeledTransport

public override void Move()

Console.WriteLine(«Легковой автомобиль выехал»);

public class AutoBus : WheeledTransport

public override void Move()

public class MicroBus : WheeledTransport

public override void Move()

public class Trolleybus : WheeledTransport

public override void Move()

Из кода выше все довольно ясно. У нас есть абстрактный класс «WheeledTransport», который объединил внутри себя другие потомственные классы имеющегося транспортного парка.

Однако представим, что бизнес идет в гору и транспортная система стала развиваться быстрыми темпами. У вас в системе появились:

лошади для перевозки людей,

собаки для перевозки людей,

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

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

лошад и и собаки в классе «животный транспорт»,

яхты, паромы, лодки в классе «водный транспорт»,

самолет ы и вертолет ы в классе «воздушный транспорт»,

public interface MyTransportSystem

public abstract class WheeledTransport

/*Тут будет перечисление потомков класса WheeledTransport */

public abstract class WaterTransport

/*Тут будет перечисление потомков абстрактного класса «WaterTransport»*/

public abstract class AirTransport

/*Тут будет перечисление потомков абстрактного класса «AirTransport»*/

public abstract class AnimalTransport

/*Тут будет перечисление потомков абстрактного класса «AnimalTransport»*/

Иногда сравнение абстрактного класса и интерфейса приводят в контексте состояния и действия. Абстрактный класс в С фокусирует свое внимание на состоянии потомственных классов, а интерфейс строится вокруг общего действия. В нашем случа е в се объекты транспортной системы объединены единым действием — перевозк ой людей, поэтому мы использовали интерфейс. Если рассматривать отдельные группы транспортной системы, тогда видно, что у них много общих признаков. Например:

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

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

Заключение

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

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

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