Является ли класс Abstract примером типа данных Abstract?

Я запутался в этих двух. Что я узнал, так это то, что абстрактный тип данных является математической моделью для типа данных, где он определяет объекты и методы для управления этими объектами без указания деталей о реализации объектов и методов. Пример: абстрактная модель стека определяет стек с операциями push и pop для вставки и удаления элементов в стек и из него. Мы можем реализовать это разными способами, используя связанные списки, массивы или классы.

Теперь, перейдя к определению абстрактного класса, это родительский класс, который имеет один или несколько методов, которые не имеют определения (реализации?) И не могут быть реализованы (так же, как мы не можем реализовать абстрактный стек как он есть, без определение базового механизма стека через одну из конкретных структур данных). Например: если у нас есть абстрактный класс Mammal, который включает функцию eat (), мы не знаем, как ест млекопитающее, потому что млекопитающее абстрактно. Хотя мы можем определить eat () для коровы, которая является производным классом млекопитающих. Означает ли это, что млекопитающее служит в качестве adt, а класс коров является реализацией adt для млекопитающих?

Поправь меня, если я ошибаюсь. Буду благодарен за любую помощь.

0

Решение

Абстрактный тип данных — это математическая модель для типа данных …

Теперь перейдем к определению абстрактного класса …

Необходимо различать теоретические математические модели и практические методы реализации.

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

Между тем, реальный код написан для того, чтобы работать и выполнять работу.

«Абстрактный тип данных» модель. «Абстрактный класс» — это методика программирования которые некоторые языки программирования (C ++, C #, Java) поддерживают на уровне языка.

«Абстрактный тип данных» позволяет думай и говори о решении проблемы, не перегружая мозг ненужными (на данный момент) деталями реализации. Когда вам нужна структура данных FIFO, вы говорите просто «Стек», но нет «двусвязный список с указателем на головной узел и возможностью …».

«Абстрактный класс» позволяет вам напиши код один раз, а затем использовать его позже (потому что это точка ООП — повторное использование кода). Когда вы видите, что несколько типов имеют общий интерфейс и функциональность — вы можете создать «абстрактный класс» и поместить пересечение их функциональности внутрь, при этом все еще имея возможность полагаться на еще не реализованные функции, которые будут реализованы каким-то конкретным типом потом. Таким образом, вы пишете код один раз, а когда вам нужно изменить его позже — это только одно место для внесения изменений.

Замечания:
Хотя в Стандарт C ++ ISO (по крайней мере в проекте) есть записка:

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

но это всего лишь записка. Настоящее определение:

Класс является абстрактным, если у него есть хотя бы одна чистая (или не реализованная) виртуальная функция.

что приводит к очевидному ограничению:

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

Лично мне нравится, что в C ++ (в отличие от C # и Java) нет ключевого слова «абстрактный». Он имеет только наследование типов и виртуальные функции (которые могут остаться нереализованными). Это поможет вам сосредоточиться на практическом вопросе: наследовать при необходимости, переопределять при необходимости.

В двух словах, используя ООП — будьте прагматичны.

2

Другие решения

Термин «абстрактный тип данных» не имеет прямого отношения к C ++. Так abstract class является одной из потенциальных стратегий реализации для реализации абстрактных типов данных на данном языке. Но есть намного больше методов, чтобы сделать это.

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

Но вы также можете использовать compile time polymorphism и связанные методы, такие как CRTP, чтобы иметь абстрактные типы данных.

Так вы Вы должны решить, какие функции вам нужны и какую цену вы хотите заплатить за это. Runtime polymorphism поставляется с дополнительными затратами на доставку vtable и vtable, но с преимуществом late binding, Compile time polymorphism поставляется с преимуществом гораздо лучшего оптимизируемого кода с более быстрым выполнением и меньшим размером кода. Оба дают вам ошибки, если интерфейс не реализован, как минимум на этапе компоновщика.

Но абстрактные типы данных с полиморфизмом, независимым от времени выполнения или времени компиляции, не являются отношением 1: 1. Делать вещи абстрактными можно также, просто определяя интерфейс, который должен быть где-то выполнено.

Вкратце: абстрактные типы данных не представлены напрямую в c ++, в то время как абстрактный базовый класс является техникой c ++.

1

Является ли класс Abstract примером типа данных Abstract?

Да, но в C ++ абстрактные классы становятся все более редким примером абстрактных типов данных, потому что универсальное программирование часто является лучшей альтернативой.

Пример: абстрактная модель стека определяет стек с помощью push и pop
операции по вставке и удалению элементов в стек и из него. Мы можем
реализовать это многими способами, используя связанные списки, массивы или классы.

C ++ std::stack шаблон класса более или менее работает следующим образом. Имеет функции-члены push а также popи это реализовано с точки зрения Container параметр типа, который по умолчанию равен std::deque,

Для реализации со связанным списком вы должны набрать std::stack<int, std::list<int>>, Однако массивы нельзя использовать для реализации стека, поскольку стек может увеличиваться и уменьшаться, а массивы имеют фиксированный размер.

Очень важно понимать, что std::stack не имеет абсолютно ничего общего с абстрактными классами или полиморфизмом времени выполнения. Здесь нет ни одной виртуальной функции.

Теперь, перейдя к определению абстрактного класса, его родительский класс
который имеет один или несколько методов, которые не имеют
определение (реализация?) и не могут быть созданы

Да, это именно определение абстрактного класса в C ++.

Теоретически такой класс стека может выглядеть так:

template <class T>
class Stack
{
public:
virtual ~Stack() = 0;
virtual void push(T const& value) = 0;
virtual T pop() = 0;
};

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

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

Да, вы не могли использовать std::stack без предоставления параметра типа контейнера (но это все равно невозможно, потому что есть значение по умолчанию std::deque параметр), и вы не можете создать экземпляр Stack<int> my_stack; или.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector