Абстрактный тип данных против не абстрактных типов данных (в Java) - PullRequest
0 голосов
/ 07 октября 2018

Я много читал об абстрактных типах данных (ADT) и спрашиваю себя, есть ли неабстрактные / конкретные типы данных?

Уже есть вопрос по SOо ADT, но этот вопрос не охватывает «неабстрактные» типы данных.

В определении ADT упоминается только то, какие операции должны быть выполнены, но не то, как эти операции будут реализованы

ссылка

Таким образом, ADT скрывает конкретную реализацию от пользователя и «только» предлагает набор допустимых операций / методов;например, стек в Java ( ссылка ).Видны только такие методы, как pop(), push(), empty(), а конкретная реализация скрыта.

После этой аргументации возникает вопрос: существует ли «неабстрактный» тип данных?

Даже примитивный тип данных, такой как java.lang.Integer, имеет четко определенные операции, такие как +, -, ... и согласно википедии это ADT.

Например, целые числа представляют собой ADT, определяемые как значения…, −2, −1, 0, 1, 2,… и операциями сложения, вычитания, умножения и деления, вместе с большим, меньшим, чем,и т. д.,

ссылка

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я согласен с ответом @progmatico, но я бы добавил, что конкретные (неабстрактные) типы данных включают в себя больше, чем примитивы.

В Java Stack является конкретным типом данных,который расширяет другой конкретный тип данных Vector, который расширяет ADT AbstractList.

Интерфейсы, реализуемые AbstractList, также являются ADT: Iterable, Collection, List.

0 голосов
/ 08 октября 2018

java.lang.Integer не является примитивным типом.Это ADT, который оборачивает примитивный тип Java int.То же самое относится и к другим типам примитивов Java и соответствующим оболочкам.

Вам не нужна поддержка ООП в языке, чтобы иметь ADT.Если у вас нет поддержки, вы устанавливаете соглашения для ADT в коде, который вы пишете (то есть вы используете его только как предыдущие, определяемые операциями и возможными значениями ADT)

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

Примитивные типы - это просто значения, которые могут храниться в памяти без какого-либо другого связанного кода.Они не знают ни о себе, ни о своих операциях.И их внутреннее представительство известно сторонним акторам, в отличие от ADT.Так же, как возможные операции.Это манипуляции со значениями, выполняемые извне, извне.

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

Если мне позволено это сказать, аппаратные средства знают ваши примитивные типы.

Таким образом, ваши неабстрактные типы данных являются примитивными типамиязык, если эти типы сами по себе не являются ADT.Если они оказываются ADT, вам, вероятно, придется их создавать (а не просто объявлять; там будет код, настраивающий вещи в памяти, а не только хранилище по определенному адресу), поэтому у них есть идентичность, и они обычно предлагают методывызывается через эту идентичность, то есть они знают о себе.

Поскольку в некоторых языках все является объектом, как в Python, встроенные типы (те, которые легко доступны без необходимости определять классы)иногда его также называют примитивом, хотя в приведенном выше определении он вообще не является примитивом.

Редактировать:

Как уже упоминалось в jaco0646, в ООП есть больше о конкретных / абстрактных словах.

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

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

Абстрактные ADT могут быть определены вами или быть доступны в языковых типах.или библиотеки.

Например, встроенный в Python объект list также является collections.abc.Iterable.

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

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

Таким образом, определение ADT, целью которого является непосредственное создание экземпляра, является конкретным ADT.В противном случае оно абстрактно.

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

Поэтому в зависимости от вашего языка вы найдетеВозможны разные (или похожие) способы реализации этой концепции.

...