web-dev-qa-db-ja.com

オブジェクト指向プログラミングの抽象データ型とは何ですか?

オブジェクト指向プログラミングの抽象データ型とは何ですか?このトピックについてはwikiを調べましたが、それについてはまだわかりません。誰かが明確にできますか?

61
sevugarajan

抽象クラスは一般化の概念です。これは、継承の基本クラスとしてのみ使用し、オブジェクトをインスタンス化しないために作成するクラスです。

Andabstract datatype[〜#〜] adt [〜#〜] )は必ずしもOOP concept。実装を説明せずに、たとえばStackとQueueの概念を機能の観点から説明するのは古い用語です。

56
Henk Holterman

abstract data type」と「abstract class」には違いがあります。

abstract classは、定義するすべてのメソッドの定義を持たない場合があります。したがって、抽象クラスを直接インスタンス化することはできません。サブクラスを作成してから、インスタンス化する必要があります。

抽象データ型は、特定の種類のデータ構造のモデルです。 スタック。 StackにはPush()およびpop()操作があり、明確に定義された動作があります。

抽象データ型(ADT)自体特定のプログラミング言語またはパラダイムでの特定の実装ではなく、このモデルを指します。 Stackはオブジェクト指向言語で実装できますが、関数型プログラミング言語で実装することもできます。

ADTは、ADTのすべての正しい実装を保持するスタック、キューなどのプロパティについての議論を可能にします。

43
ctford

まあ、それはすべてabstractionです。抽象化は、プログラミングで特に役立ちます。主な利点は、実現の詳細を隠すことができることです。 1つのモジュール(いわゆる「サーバーモジュール」)内で非表示にし、他のモジュール(いわゆる「クライアントモジュール」)にパブリックインターフェイスを提供します。そして今、3つの異なる可能性があります:

サーバーモジュールは、abstract data structure(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;
}

サーバーモジュールは、abstract data type(ADT)をstruct/recordの形式で提供できます。

クライアントモジュールでは、変数をその型に宣言できます。モジュールは、エクスポートされた型であると複数の変数を自由に宣言できるため、複数のデータ構造を持つことができます。各抽象データ構造は、抽象データ型の変数です。

インターフェイス(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;
}

最後に、サーバーモジュールはabstractデータ型(ADT)classの形式で提供できます。

言語サポートOOPクラスを使用してADTを記述できます。クライアントモジュールでは、変数をその型に宣言できます。オブジェクト指向の用語では、型はclass、およびそのタイプの変数はobjectと呼ばれます。

サーバーモジュールインターフェイス(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;
}

最後の2つのオプションの違いは次のとおりです。

  • 上記の用語(タイプ<->クラス、変数<->オブジェクト)。
  • 非クラスADTでは、すべてのプロシージャの仮パラメーターリストにStack型の変数sを含める必要があります。スタッククラスでは、データ構造体sの指定は、プロシージャの名前に続く他の仮パラメータには含まれませんが、プロシージャの名前の前に括弧で囲まれて単独で存在します。プロシージャ名がreceiverと呼ばれる前にSmalltalk用語の仮パラメータを使用します。
  • プロシージャの場所。非クラスADTでは、プロシージャはStack構造体の外部にあります。クラスでは、プロシージャはクラス内にあります。オブジェクト指向の用語では、レシーバを持ち、したがってクラス型に含まれるプロシージャは、methodsと呼ばれます。

クライアントコード:

#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;
}
9
Wildcat

抽象データ型(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スタイルの考え方があまり効果的でないOOデザインを生成するため、ADTの概念はおそらくオブジェクト指向プログラミングよりも機能プログラミングに適用されます。

  • OO言語: http://portal.acm.org/citation.cfm?id=74885 でのADTの観点から考える問題を実証する論文です。 =
  • 基本的に、このペーパーは、ADTを実装するために使用する「クラス」が、いくつかの強力で高抽象化されたメソッドではなく、多くの小さなメソッド(ADT方程式の基礎のように見える)で覆われていることを示しています。
6
Dafydd Rees

定義:

大まかに言えば、Abstract Data Type(ADT)はデータ構造を見る方法です:それが何をするかに焦点を当て、その方法を無視しますその仕事。

抽象データ型は、主にそれらのインターフェイス、つまり実行可能な操作によって定義されます。それらの実装に使用される基本的なメカニズムは、通常、ユーザーには表示されません。


例:

StackQueue、およびPriorityQueueはADTの例の一部です。これらは、配列、リンクリスト、および他の多くのデータストレージ構造よりも抽象的です。

たとえば、スタックの基盤となるメカニズムは、Arrayでも、LinkedListでもかまいません。 PriorityQueueの基になるメカニズムは、ArrayまたはHeapと呼ばれる特別な種類のツリーです。


コード:

ヒープを使用して実装されたPriorityQueueと呼ばれる抽象データ型のJavaの例:

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はオブジェクト指向プログラミング(OOP)言語ではより意味がありますが、OOP言語のみに限定されず、非OOP言語を使用して作成することもできます。


6

抽象は、プログラミングおよび実生活で最も基本的かつ一般化された概念です。

オブジェクト指向プログラミングの抽象データ型とは何ですか?

ADTは、仕様を持つさまざまなタイプのオブジェクトを保持するコンテナです。データの論理表現(つまり、インターフェイスまたはプロトコル)と、データのコンポーネント要素を操作する操作。

ADTの例:リスト、マップ、セット、スタック、キュー、ツリー、グラフ。

データ構造は、1つ以上の特定の抽象データ型(ADT)を実装できます。 Java ArrayList、LinkedList、Stack、Vectorなどは、Listのデータ構造の実装(クラス)です。

実際のスタック例:

  1. 人がバングルを着用すると、最後に着用したバングルが最初に取り外され、最初のバングルが最後に取り外されます。これは、後入れ先出し(LIFO)スタックの原則に従います。
  2. platesのスタックでは、プレートを上から取り出すか、プレートを上に保つことができます。最初に置かれたプレートが最後に取り出されます。これはLIFOスタックの原則に従います。
  3. バッテリー懐中電灯の場合:-最後のバッテリーを取り外さない限り、2番目のバッテリーを取り外すことはできません。持ち出します。これはLIFOスタックの原則に従います。
  4. トランク内の服

実際のキューの例

  1. ticket-windowの人々の列:最初に来た人が最初にチケットを受け取ります。最後に来ている人が最後にチケットを取得しています。したがって、キューの先入れ先出し(FIFO)戦略に従います。
  2. 料金所の橋の上の車両:料金所のブースに最初に来る車両は、ブースを最初に出発します。最後に来る車両は最後に出発します。したがって、キューの先入れ先出し(FIFO)戦略に従います。
  3. 荷物チェックマシン:荷物チェックマシンは、最初に来る荷物を最初にチェックします。したがって、FIFOキューの原則に従います。
  4. 患者医師の診療所の外で待っている:最初に来た患者が最初に医者を訪問し、最後に来た患者が最後に医者を訪問します。したがって、キューの先入れ先出し(FIFO)戦略に従います。

Source1 および Source2 から収集した上記の例

3
Premraj

学校では、ADTは単なるデータのコレクションと、このデータを引き継ぐことができる一連の操作を含むグループであると教えてくれました。それは単にアイデアを指し、は、言語、実装ともパラダイムとも関係ありません。

更新しました:
質問を読み直し、miの定義に応じて、OOPの抽象データ型は、データを含むため、継承されるかどうかにかかわらず、クラス抽象化である必要があります。フィールドなど)および操作(メソッド)。

よろしく

3
Matias

コードから一歩戻ります。

Abstractはどういう意味ですか? 要約

その要点は「本物ではないが、本物の特性を捉えている」

OOPの場合、これを知る必要があります。オブジェクトユニバースを設計するため、これらのオブジェクトがどのように関連しているかを考える必要があります。

抽象化により、これらのオブジェクトの一部をグループ化して、整理することができます

1)あなたの思考プロセス2)あなたのコード

1
Carlos

私は先週まで同じ問題を抱えていました。

抽象クラスは、一般的なものまたは一般的なものです。そのクラスを使用して、それを成形し、好きなように拡張することができます。

ここで実用的な例を挙げることができます

動物と呼ばれるクラスを取ります。そして、それはすべての動物が行う一般的な食事、音、動きのような機能を含んでいます。そのクラスを拡張して、猫、犬などの特定のクラスを取得できます。

例えば。

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";
   }
}

私の答えがあなたにとって意味があることを願って

  1. クラスは、absractデータ型として知られるデータ抽象化の概念を使用します。

  2. 抽象データ型は、実装を説明せずに機能に関してスタックとキューの概念を説明する古い用語です。

1
vaibhav jain

抽象データ型(ADT)は、そのモデルで定義された操作のコレクションを持つ数学モデルです。

また、ADTは、値のセットと操作のセットによって動作が定義されるデータ型です。

1
Aditya

簡単に言うと、抽象とは、定義されたクラスからオブジェクトを作成できないことを意味します。例:形状、正方形、長方形のクラスはあるが、形状からオブジェクトを定義したくない場合は、抽象としてマークします...

その後、ユーザーがshapeから新しいオブジェクトを定義しようとすると、コンパイラエラーが発生します。

0
Wael Dalloul

この投稿 から:

ADTはオブジェクトと操作のセットです。ADTの定義のどこにも、操作のセットの実装方法に関する記述はありません。コレクションを使用するプログラマーは、コレクションの実装の詳細を気にすることなく、事前に決められた方法でデータをインスタンス化してアクセスする方法を知るだけで済みます。つまり、ユーザーの観点からすると、コレクションは抽象化であり、このため、コンピューターサイエンスでは、一部のコレクションは抽象データ型(ADT)と呼ばれます。ユーザーは、そのインターフェイス、または実行する一連の操作を学習することのみに関心があります。

リスト、セット、グラフなどのオブジェクトとその操作は、抽象データ型として表示できます。 ADTは基本的に、実装の詳細を隠すデータ型です。 ADTで操作を実行する必要があるプログラムの部分は、ADT操作を実行するルーチンを変更するだけで実行できます。それらを使用するプログラム(ADT)は、必ずしもどの実装が使用されたかを知る必要はありません。

0
Muyide Ibukun

これは、Code Completeの引用です。抽象データ型は、クラスの概念の基礎を形成します。クラスをサポートする言語では、各抽象データ型を独自のクラスに実装できます。クラスには通常、継承とポリモーフィズムの追加の概念が含まれます。クラスの考え方の1つは、抽象データ型に継承とポリモーフィズムを加えたものです。

したがって、私の意見では、OOの抽象データ型は抽象クラスを意味します。

0
user227612

ADTは一種のデータ構造です。データの構造を記述する代わりに、データに対する操作を記述します。

たとえば、スタックとは何ですか?検索ツリーまたは線形データ構造かもしれませんが、ユーザーは気にしません。ユーザーは「後入れ先出し」(LIFO)を気にするだけです。

0
lovespring

ADTは、一連のデータ値とこれらの値に対する一連の操作を定義します。

0
Rohan

オブジェクト指向プログラミングの抽象データ型とは何ですか?

クラス/抽象データ型は、オブジェクト指向の方法でいくつかの問題を解決する際に処理する可能性のあるすべてのプロパティと機能(データにアクセスするための)のグループです。

オブジェクトとは何ですか?

オブジェクトは、そのプロパティと機能にアクセスできるクラス/抽象データ型へのインターフェイスです。オブジェクトには、データの保存に使用されるメモリが関連付けられています。

0
Aquarius_Girl