Подтвердить что ты не робот

Что такое абстрактный тип данных в объектно-ориентированном программировании?

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

4b9b3361

Ответ 1

Абстрактный класс - это понятие обобщения. Это класс, который вы изобретаете, только для использования в качестве базового класса для наследования, но не для создания экземпляров объектов.

И абстрактный тип данных (ADT) не обязательно является концепцией ООП. Это более ранний термин для описания концепций, например Stack и Queue, с точки зрения их функциональности, без описания реализации.

Ответ 2

Существует разница между "абстрактным типом данных и абстрактным классом.

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

абстрактный тип данных - это модель определенного типа структуры данных, например. a Стек. У Stack есть операции push() и pop() и которые имеют четко определенное поведение.

Сам абстрактный тип данных (ADT) относится к этой модели, а не к какой-либо конкретной реализации на каком-либо конкретном языке программирования или парадигме. Вы можете реализовать Stack на объектно-ориентированном языке, но вы также можете реализовать его на функциональном языке программирования.

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

Ответ 3

Ну, это все о абстракции. Абстракция особенно полезна при программировании. Основное преимущество - это способность скрывать детали реализации. Вы скрываете его внутри одного модуля (так называемые "серверные модули" ) и предоставляете некоторый открытый интерфейс для других модулей (так называемых "клиентских модулей" ). И теперь у нас есть три разные возможности:

Серверный модуль может предоставлять абстрактную структуру данных (ADS).

В этом случае он содержит сам объект ADS. Открытый интерфейс состоит из некоторых процедур (и, возможно, некоторых констант).

Интерфейс серверного модуля (stack_ads.h):

#ifndef STACK_ADS
#define STACK_ADS

const int capacity = 10;

void clear();
int size();
int pop();
void push(int value);

#endif STACK_ADS

Реализация (stack_ads.cpp):

#include "stack_ads.h"

int items[capacity];
int top = -1;

void clear()
{
  top = -1;
}

int size()
{
  return top + 1;
}

int pop()
{
  top -= 1;
  return items[top + 1];
}

void push(int value)
{
  top += 1;
  items[top] = value;
}

В клиентском модуле (main.cpp) мы импортируем серверный модуль и напрямую используем структуру данных.

#include <iostream>
#include "stack_ads.h"

int main (int argc, char* const argv[]) 
{
  push(1);
  push(2);
  push(3);

  std::cout << pop() << std::endl;
  std::cout << pop() << std::endl;
  std::cout << pop() << std::endl;

  return 0;
}

Серверный модуль может предоставлять абстрактный тип данных (ADT) в виде структуры/записи.

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

Интерфейс (stack_adt.h):

#ifndef STACK_ADT
#define STACK_ADT

const int capacity = 10;

typedef struct
{
  int items[capacity];
  int top;
} StackADT;

void clear(StackADT* stack);
int size(StackADT* stack);
int pop(StackADT* stack);
void push(StackADT* stack, int value);  

#endif STACK_ADT

Реализация (stack_adt.cpp):

#include "stack_adt.h"

void clear(StackADT* stack)
{
  stack->top = -1;
}

int size(StackADT* stack)
{
  return stack->top + 1;
}

int pop(StackADT* stack)
{
  stack->top -= 1;
  return stack->items[stack->top + 1];
}

void push(StackADT* stack, int value)
{
  stack->top += 1;
  stack->items[stack->top] = value;
}

Клиентский модуль:

#include <iostream>
#include "stack_adt.h"

int main (int argc, char* const argv[]) 
{
  StackADT stack1;
  StackADT stack2;
  stack1.top = -1;
  stack2.top = -1;

  push(&stack1, 1);
  push(&stack1, 2);
  push(&stack1, 3);

  std::cout << pop(&stack1) << std::endl;
  std::cout << pop(&stack1) << std::endl;
  std::cout << pop(&stack1) << std::endl;

  push(&stack2, 10);
  push(&stack2, 20);
  push(&stack2, 30);

  std::cout << pop(&stack2) << std::endl;
  std::cout << pop(&stack2) << std::endl;
  std::cout << pop(&stack2) << std::endl;

  return 0;
}

Наконец, серверный модуль может предоставить абстрактный тип данных (ADT) в виде класса.

Если наш язык поддерживает ООП, мы можем описать ADT с помощью классов. И еще раз в клиентском модуле мы можем объявить переменные того типа. В объектно-ориентированной терминологии тип называется классом, а переменная с этим типом называется объектом.

Интерфейс модуля сервера (Stack.h):

#ifndef STACK
#define STACK

const int capacity = 10;

class Stack
{
public:
  Stack();
  void clear();
  int size();
  int pop();
  void push(int value);
private:
  int items[capacity];
  int top;
};

#endif STACK

Реализация (Stack.cpp):

#include "Stack.h"

Stack::Stack()
{
  this->top = -1;
}

void Stack::clear()
{
  this->top = -1;
}

int Stack::size()
{
  return this->top + 1;
}

int Stack::pop()
{
  this->top -= 1;
  return this->items[this->top + 1];
}

void Stack::push(int value)
{
  this->top += 1;
  this->items[this->top] = value;
}

Различия между двумя последними параметрами:

  • Терминология, упомянутая выше (тип ↔ class, variable ↔ object).
  • В неклассовом ADT формальный список параметров каждой процедуры должен включать переменную s типа Stack. В классе стека спецификация структуры данных s не включается в другие формальные параметры, следующие за именем процедуры, но отдельно стоящих в круглых скобках перед именем процедуры. Использование формального параметра терминологии Smalltalk до имени процедуры называется приемником.
  • Расположение процедур. В неклассовом ADT процедуры расположены вне структуры Stack. В классе процедуры расположены внутри класса. В объектно-ориентированной терминологии процедуры, которые имеют приемники и поэтому содержатся внутри класса, называются методами.

Клиентский код:

#include <iostream>
#include "stack.h"

int main (int argc, char* const argv[]) 
{
  Stack stack1;
  Stack stack2;

  stack1.push(1);
  stack1.push(2);
  stack1.push(3);

  std::cout << stack1.pop() << std::endl;
  std::cout << stack1.pop() << std::endl;
  std::cout << stack1.pop() << std::endl;

  stack2.push(10);
  stack2.push(20);
  stack2.push(30);

  std::cout << stack2.pop() << std::endl;
  std::cout << stack2.pop() << std::endl;
  std::cout << stack2.pop() << std::endl;

  return 0;
}

Ответ 4

Абстрактный тип данных (ADT) - это математическая модель типа данных. Он описывает операции, которые могут быть выполнены с данными, и математическое определение этих операций с использованием уравнений.

Например, вы можете смоделировать поведение стека чисел, совершенно абстрактно используя такие операции, как pop(), push(), top() и, возможно, постоянный символ, представляющий пустой стек.

Например, вот некоторые уравнения, которые могут составлять часть определения стека чисел:

pop(empty) = empty  // silently ignores popping an empty stack
pop(push(N,S)) = S  // i.e. pop removes the top element of push(N,S)
top(push(N,S)) = N  // return topmost element of the stack without changing the stack

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

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

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

Запись в Википедии об этом довольно хороша: http://en.wikipedia.org/wiki/Abstract_data_type

Вот несколько хороших (но очень теоретических) примечаний к курсу, которые определяют, что такое ADT. Http://www-compsci.swan.ac.uk/~csulrich/ftp/adt/adt.pdf

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

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

  • Вот документ, демонстрирующий проблемы мышления в терминах ADT на языке ОО: http://portal.acm.org/citation.cfm?id=74885
  • По сути, в статье показано, что "класс", который вы используете для реализации ADT, в конечном итоге покрывается множеством крошечных маленьких методов (которые выглядят как основа уравнений ADT), а не несколькими мощными методами с высокой абстракцией.

Ответ 5

Определение:

Грубо говоря, Абстрактный тип данных (ADT) - это способ взглянуть на структуру данных: сосредоточиться на том, что она делает, и игнорировать, как она выполняет свою работу.

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


Примеры:

Stack, Queue и PriorityQueue являются некоторыми примерами ADT, они более абстрактны, чем говорят массивы, связанные списки и многие другие структуры хранения данных.

Например, основной механизм для стека может быть Array или может быть LinkedList. Основным механизмом для PriorityQueue может быть Array или особый вид дерева, называемый Heap.


код:

Вот пример Java абстрактного типа данных, называемый PriorityQueue, реализованный с помощью кучи:

class Heap {
  private Node heapArray[];
  public void insert(Node node) {...}
  public Node remove() {...}
}

class PriorityQueue {
  private Heap heap;
  public void insert(Node node) { 
    heap.insert(node);
  }
  public Node remove() {
    return heap.remove();
  }
}

Здесь вы можете увидеть, что методы класса PriorityQueue просто обернуты вокруг методов для базового класса Heap. Аналогично, вы можете использовать Array вместо Heap для реализации той же функциональности, даже если в случае Array вам понадобится больше кода для выполнения операций, таких как вставка и удаление. Этот пример должен сделать концептуально понятным, что PriorityQueue является ADT, который может быть реализован различными способами, используя кучи, массивы и т.д.

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


Ответ 6

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

Обновлено:
поэтому повторное чтение вопроса и, соответственно, определение mi, абстрактный тип данных в ООП должен представлять собой абстракцию класса, унаследованную или нет, поскольку он содержит данные (свойства, поля и т.д.) и операции (методы).

рассматривает

Ответ 7

Реферат - самое фундаментальное и обобщенное понятие в программировании и реальной жизни.

Что такое абстрактный тип данных в объектно-ориентированном программировании?

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

Примеры ADT: список, карта, набор, стек, очередь, дерево, график.

Структуры данных могут реализовывать один или несколько конкретных типов абстрактных данных (ADT). В java, например ArrayList, LinkedList, Stack и Vector - реализация (классы) структур данных в List.

Примеры стека в реальной жизни:

  • Когда человек носит <сильные > браслеты, последний из них - первый удаляться, и первый bangle будет последним, который будет удален. Это следует за последним в первом (LIFO) принципе стека.
  • В стопке пластин один раз может вынуть пластину сверху или может держите плиту наверху. Пластина, которая была помещена первой, была бы последний раз вынимать. Это следует за принципом LIFO стека.
  • Аккумуляторы в фонарике: - Вы не можете снять вторую батарею если вы не удалите последний дюйм. Таким образом, батарея, которая была вставлена ​​первой будет последним. Это следует принципу LIFO стека.
  • Одежда в багажнике

примеры очереди в реальной жизни

  • Очередь людей в билетном окне . Человек, который приходит первым, сначала получает билет. Человек, который придет последним, получает билеты последним. Следовательно, это следует из стратегии первого порядка (FIFO) очереди.
  • Транспортные средства на мосту с уплатой пошлины: транспортное средство, которое прибывает сначала в налоговую будочку сборы, покидает стенд в первую очередь. Транспортное средство, которое прибывает последним, остается последним. Следовательно, это следует из стратегии первого порядка (FIFO) очереди.
  • Багаж: машина для проверки багажа проверяет багаж первым, что на первом месте. Поэтому он следует принципу FIFO очереди.
  • Пациенты ждут снаружи врачебной клиники: пациент, который сначала приходит к врачу, а пациент, который приходит последним, посещает врача последним. Поэтому он следует стратегии первого порядка (FIFO) очереди.

Вышеприведенные примеры собраны из Source1 и Source2

Ответ 8

У меня была такая же проблема до прошлой недели.

Абстрактный класс - это нечто общее или что-то общее. Вы можете использовать этот класс для его форматирования и расширения в любом случае.

Я могу привести здесь практический пример.

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

например.

abstract class animal {

    abstract protected function eat();
    abstract protected function sound();        

}

class dogs extends animal
{
   protected function eat() {
       return "meat";
   }

   public function sound() {
       return "bow wow";
   }
}

надеюсь, что мой ответ имеет смысл для вас

Ответ 9

Сделайте один шаг назад от кода:

Что означает абстрактный? Abstract

Суть его "не реальна, а захватывает свойство реальных вещей"

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

Абстракция позволяет группировать некоторые из этих объектов, тем самым организуя

1) Ваш процесс мышления 2) Ваш код

Ответ 10

  • Классы
  • используют концепцию абстракции данных, которая известна как тип данных абзаца.

  • абстрактный тип данных является более старым термином для описания концепций стека и очередей с точки зрения их функциональности без описания их реализации.

Ответ 11

Абстрактный тип данных (ADT) - это математическая модель с набором операций, определенных в этой модели.

Кроме того, ADT - это тип данных, поведение которого определяется набором значений и набором операций.

Ответ 12

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

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

Ответ 13

Это из кода Complete -Quote: Абстрактные типы данных образуют основу для концепции классов. В lanuages, поддерживающих классы, вы можете реализовать каждый абстрактный тип данных в своем классе. Классы обычно включают дополнительные концепции наследования и полиморфизма. Один из способов мышления класса - это абстрактный тип данных плюс наследование и полиморфизм.

Итак, на мой взгляд, абстрактный тип данных в OO означает абстрактный класс.

Ответ 14

Что такое абстрактный тип данных в объектно-ориентированном программировании?

Класс/Абстрактный тип данных - это группа свойств и функций (для доступа к данным) всего, с чем мы можем столкнуться при решении некоторой задачи объектно-ориентированным способом.

Что такое объект?

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

Ответ 15

ADT - это своего рода структура данных. Вместо описания структуры данных, он описывает операцию над данными.

Например, что такое стек? Может быть, дерево поиска или какая-то линейная структура данных, но пользователю все равно. Пользователь заботится только о том, кто последним вышел (LIFO).

Ответ 16

ADT определяет набор значений данных и набор операций над этими значениями.

Ответ 17

Из этого поста:

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

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

Ответ 18

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

Возьмем пример Птицы. Если вы пишете прогрм, который будет иметь какое-то отношение к птицам, тогда вы сначала получите абстрактный базовый класс, как Птица, и каждая птица, полученная из абстрактного базового класса Bird. Обратите внимание, что абстрактный класс BIRD не представляет собой конкретный объект реального мира, а тип связанных объектов, которые являются птицами!

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

alt text http://ruchitsurati.net/files/birds.png

public abstract class Bird
{
    protected string Name = string.Empty;
    public Bird(string name)
    {
        this.Name = name;
    }

    public virtual void Fly()
    {
        Console.WriteLine(string.Format("{0} is flying.", this.Name));
    }

    public virtual void Run()
    {
        Console.WriteLine(string.Format("{0} cannot run.", this.Name));
    }
}

public class Parrot : Bird
{
    public Parrot() : base("parrot") { }
}

public class Sparrow : Bird
{
    public Sparrow() : base("sparrow") { }
}

public class Penguin : Bird
{
    public Penguin() : base("penguin") { }

    public override void Fly()
    {
        Console.WriteLine(string.Format("{0} cannot fly. Some birds do not fly.", this.Name));
    }

    public override void Run()
    {
        Console.WriteLine(string.Format("{0} is running. Some birds do run.", this.Name));
    }
}

class Program
{
    static void Main(string[] args)
    {

        Parrot p = new Parrot();
        Sparrow s = new Sparrow();
        Penguin pe = new Penguin();

        List<Bird> birds = new List<Bird>();

        birds.Add(p);
        birds.Add(s);
        birds.Add(pe);

        foreach (Bird bird in birds)
        {
            bird.Fly();
            bird.Run();
        }

        Console.ReadLine();
    }
}

Ответ 19

Абстрактный тип означает, чьи объекты не существуют в реальном мире, поскольку он не имеет физический объект.

Он действует как базовый класс для конкретного класса, который имеет физическое существование.

например.

 Shape is an abstract class whereas circle,rectangle are concrete classes.