オブジェクト指向プログラミングの抽象データ型とは何ですか?このトピックについてはwikiを調べましたが、それについてはまだわかりません。誰かが明確にできますか?
抽象クラスは一般化の概念です。これは、継承の基本クラスとしてのみ使用し、オブジェクトをインスタンス化しないために作成するクラスです。
Andabstract datatype( [〜#〜] adt [〜#〜] )は必ずしもOOP concept。実装を説明せずに、たとえばStackとQueueの概念を機能の観点から説明するのは古い用語です。
「abstract data type」と「abstract class」には違いがあります。
abstract classは、定義するすべてのメソッドの定義を持たない場合があります。したがって、抽象クラスを直接インスタンス化することはできません。サブクラスを作成してから、インスタンス化する必要があります。
抽象データ型は、特定の種類のデータ構造のモデルです。 スタック。 StackにはPush()およびpop()操作があり、明確に定義された動作があります。
抽象データ型(ADT)自体特定のプログラミング言語またはパラダイムでの特定の実装ではなく、このモデルを指します。 Stackはオブジェクト指向言語で実装できますが、関数型プログラミング言語で実装することもできます。
ADTは、ADTのすべての正しい実装を保持するスタック、キューなどのプロパティについての議論を可能にします。
まあ、それはすべてabstractionです。抽象化は、プログラミングで特に役立ちます。主な利点は、実現の詳細を隠すことができることです。 1つのモジュール(いわゆる「サーバーモジュール」)内で非表示にし、他のモジュール(いわゆる「クライアントモジュール」)にパブリックインターフェイスを提供します。そして今、3つの異なる可能性があります:
その場合、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;
}
クライアントモジュールでは、変数をその型に宣言できます。モジュールは、エクスポートされた型であると複数の変数を自由に宣言できるため、複数のデータ構造を持つことができます。各抽象データ構造は、抽象データ型の変数です。
インターフェイス(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;
}
言語サポート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つのオプションの違いは次のとおりです。
クライアントコード:
#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;
}
抽象データ型(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の概念はおそらくオブジェクト指向プログラミングよりも機能プログラミングに適用されます。
大まかに言えば、Abstract Data Type(ADT)はデータ構造を見る方法です:それが何をするかに焦点を当て、その方法を無視しますその仕事。
抽象データ型は、主にそれらのインターフェイス、つまり実行可能な操作によって定義されます。それらの実装に使用される基本的なメカニズムは、通常、ユーザーには表示されません。
Stack
、Queue
、および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言語を使用して作成することもできます。
抽象は、プログラミングおよび実生活で最も基本的かつ一般化された概念です。
オブジェクト指向プログラミングの抽象データ型とは何ですか?
ADTは、仕様を持つさまざまなタイプのオブジェクトを保持するコンテナです。データの論理表現(つまり、インターフェイスまたはプロトコル)と、データのコンポーネント要素を操作する操作。
ADTの例:リスト、マップ、セット、スタック、キュー、ツリー、グラフ。
データ構造は、1つ以上の特定の抽象データ型(ADT)を実装できます。 Java ArrayList、LinkedList、Stack、Vectorなどは、Listのデータ構造の実装(クラス)です。
実際のスタック例:
実際のキューの例
学校では、ADTは単なるデータのコレクションと、このデータを引き継ぐことができる一連の操作を含むグループであると教えてくれました。それは単にアイデアを指し、は、言語、実装ともパラダイムとも関係ありません。
更新しました:
質問を読み直し、miの定義に応じて、OOPの抽象データ型は、データを含むため、継承されるかどうかにかかわらず、クラス抽象化である必要があります。フィールドなど)および操作(メソッド)。
よろしく
コードから一歩戻ります。
Abstractはどういう意味ですか? 要約
その要点は「本物ではないが、本物の特性を捉えている」
OOPの場合、これを知る必要があります。オブジェクトユニバースを設計するため、これらのオブジェクトがどのように関連しているかを考える必要があります。
抽象化により、これらのオブジェクトの一部をグループ化して、整理することができます
1)あなたの思考プロセス2)あなたのコード
私は先週まで同じ問題を抱えていました。
抽象クラスは、一般的なものまたは一般的なものです。そのクラスを使用して、それを成形し、好きなように拡張することができます。
ここで実用的な例を挙げることができます
動物と呼ばれるクラスを取ります。そして、それはすべての動物が行う一般的な食事、音、動きのような機能を含んでいます。そのクラスを拡張して、猫、犬などの特定のクラスを取得できます。
例えば。
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";
}
}
私の答えがあなたにとって意味があることを願って
クラスは、absractデータ型として知られるデータ抽象化の概念を使用します。
抽象データ型は、実装を説明せずに機能に関してスタックとキューの概念を説明する古い用語です。
抽象データ型(ADT)は、そのモデルで定義された操作のコレクションを持つ数学モデルです。
また、ADTは、値のセットと操作のセットによって動作が定義されるデータ型です。
簡単に言うと、抽象とは、定義されたクラスからオブジェクトを作成できないことを意味します。例:形状、正方形、長方形のクラスはあるが、形状からオブジェクトを定義したくない場合は、抽象としてマークします...
その後、ユーザーがshapeから新しいオブジェクトを定義しようとすると、コンパイラエラーが発生します。
この投稿 から:
ADTはオブジェクトと操作のセットです。ADTの定義のどこにも、操作のセットの実装方法に関する記述はありません。コレクションを使用するプログラマーは、コレクションの実装の詳細を気にすることなく、事前に決められた方法でデータをインスタンス化してアクセスする方法を知るだけで済みます。つまり、ユーザーの観点からすると、コレクションは抽象化であり、このため、コンピューターサイエンスでは、一部のコレクションは抽象データ型(ADT)と呼ばれます。ユーザーは、そのインターフェイス、または実行する一連の操作を学習することのみに関心があります。
リスト、セット、グラフなどのオブジェクトとその操作は、抽象データ型として表示できます。 ADTは基本的に、実装の詳細を隠すデータ型です。 ADTで操作を実行する必要があるプログラムの部分は、ADT操作を実行するルーチンを変更するだけで実行できます。それらを使用するプログラム(ADT)は、必ずしもどの実装が使用されたかを知る必要はありません。
これは、Code Completeの引用です。抽象データ型は、クラスの概念の基礎を形成します。クラスをサポートする言語では、各抽象データ型を独自のクラスに実装できます。クラスには通常、継承とポリモーフィズムの追加の概念が含まれます。クラスの考え方の1つは、抽象データ型に継承とポリモーフィズムを加えたものです。
したがって、私の意見では、OOの抽象データ型は抽象クラスを意味します。
ADTは一種のデータ構造です。データの構造を記述する代わりに、データに対する操作を記述します。
たとえば、スタックとは何ですか?検索ツリーまたは線形データ構造かもしれませんが、ユーザーは気にしません。ユーザーは「後入れ先出し」(LIFO)を気にするだけです。
ADTは、一連のデータ値とこれらの値に対する一連の操作を定義します。
オブジェクト指向プログラミングの抽象データ型とは何ですか?
クラス/抽象データ型は、オブジェクト指向の方法でいくつかの問題を解決する際に処理する可能性のあるすべてのプロパティと機能(データにアクセスするための)のグループです。
オブジェクトとは何ですか?
オブジェクトは、そのプロパティと機能にアクセスできるクラス/抽象データ型へのインターフェイスです。オブジェクトには、データの保存に使用されるメモリが関連付けられています。