web-dev-qa-db-ja.com

カプセル化と抽象化の違い

今日はインタビューをしました。 OOPからカプセル化抽象化?の違いについて質問がありました

Encapsulationは基本的にデータメンバーとメンバー関数をClassと呼ばれる単一のユニットにバインドするという私の知識に彼女に答えました。一方、Abstractionは、基本的に実装の複雑さを隠し、ユーザーが簡単にアクセスできるようにすることです。彼女は私の答えで大丈夫だと思った。しかし、彼女は、両方の目的が情報を隠すことである場合、これら2つの間の実際の違いは何ですか?彼女には何も答えられませんでした。

この質問をする前に、StackOverFlowの他のスレッドで、これら2つのOOP sの概念の違いについて読みました。しかし、私はインタビュアーを説得する立場に自分を見つけていません。

誰でも最も簡単な例でそれを正当化できますか?

52
WpfBee

カプセル化変数または頻繁に変更される可能性のある一部の実装を非表示にしますクラス内部外者が直接アクセスできないようにします。ゲッターメソッドとセッターメソッドを介してアクセスする必要があります。

Abstractionは何かを隠すためにも使用されますが、higher degree(class、interface)で使用されます。クライアントは抽象クラス(またはインターフェイス)を使用しますが、それが誰であるか、または誰であるかは気にしません。何ができるかを知る必要があるだけです。

47
phnkha

この画像は、両方の違いを非常にうまくまとめています。

enter image description here

ソース ここ

11
José Salgado

抽象化-オブジェクトのセットに共通する本質的な特性を識別するプロセス(およびこのプロセスの結果)です。抽象化は一般化のプロセスであると言うかもしれません。検討中のすべてのオブジェクトはオブジェクトのスーパーセットに含まれ、すべてが特定のプロパティを所有します(ただし、他の点では異なります)。

カプセル化-データと、このデータを単一のユニットに操作する関数を囲み、内部実装を外界から隠すプロセスです。

これは、特定のプログラミング言語に関連しない一般的な回答です(質問と同様)。そのため、答えは次のとおりです。抽象化とカプセル化には共通点はありません。しかし、それらの実装は互いに関連している可能性があります(たとえば、Javaの場合:カプセル化-詳細はクラスに隠され、抽象化-詳細はクラスまたはインターフェースにまったく存在しません)。

10
TT_

Abstraction:通常、クラスのセットへのポリモーフィックアクセスを提供するために行われます。抽象クラスはインスタンス化できないため、より具体的な表現を作成するには別のクラスから派生する必要があります。

抽象クラスの一般的な使用例は、抽象インジェクションポイントが導入されるテンプレートメソッド設計パターンの実装で、具体的なクラスが独自の「具体的な」方法で実装できるようにすることができます。

参照: http://en.wikipedia.org/wiki/Abstraction_(computer_science)

カプセル化:特定のクラスの実装の複雑さを、それを使用しようとしているクライアントから隠すプロセスです。 「クラスを書いた人がプログラムまたはイベントにすることができます。

参照: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

6
Mortalus

カプセル化:コードとデータを1つのユニットにラップします。 Classは、メソッドとプロパティをラップするため、カプセル化の例です。

抽象:内部の詳細を非表示にし、機能のみを表示します。抽象化は、オブジェクトの機能ではなく、オブジェクトの機能に焦点を合わせます。クラスの一般的なビューを提供します。

int number = 5;
string aStringNumber = number.ToString(); 

ここで、ToString()は抽象化です。そして、このメカニズムnumber変数が文字列に変換され、aStringNumberに初期化される方法はカプセル化です。

電卓の実際の例を見てみましょう。カプセル化は内部回路、バッテリーなどであり、これらを組み合わせて計算機にします。抽象化とは、オンオフ、クリアなどのさまざまなボタンで、それを操作するために提供されるボタンです。

3
Arif

抽象化、カプセル化、および情報隠蔽の違いに関する詳細な記事があります。 http://www.tonymarston.co.uk/php-mysql/abstraction.txt

この記事の結論は次のとおりです。

抽象化、情報の隠蔽、およびカプセル化は非常に異なりますが、非常に関連性の高い概念です。抽象化は、どの特定の情報を表示し、どの情報を非表示にするかを識別するのに役立つ手法であると主張することができます。カプセル化は、非表示にする必要があるものを非表示にし、表示することを意図したものを表示するように情報をパッケージ化するための手法です。

2
pulp_fiction

両方の違いはView Pointだけです
カプセル化ワードは、クライアントがロジックの内部ビューを表示しないようにすることを目的としている場合、データを隠すために使用されます

抽象化ワードは、クライアントに外部ビューを表示することが目的の場合にデータを非表示にするために使用されます

外側のビューとは、

BubbleSort(){
//code 
swap(x,y);
}

ここでは、バブルソートでスワップを使用して、適用するロジックをクライアントに示すだけです。swap(x、y)をここでコード全体に置き換えた場合、単一のインスタンスではロジックを理解できません

1
Iqbal Haider

カプセル化:

薬のカプセルのようなものを隠します。カプセルに何が入っているかわかりませんが、それをそのまま摂取します。プログラミングと同じ-メソッドまたはプロパティの特別なコードを非表示にするだけで、カプセルと同様に出力のみを提供します。つまり、カプセル化はデータを隠します。

抽象化:

抽象化とは、ロジックまたは実装を隠すことを意味します。たとえば、タブレットを使用してその色を確認しますが、これが何の目的であり、どのように体に作用するかはわかりません。

1
Zeeshan Haider

はい、抽象化とカプセル化が隠れていることは事実です。

  • 関連する詳細のみを使用し、設計レベルで不要なデータを非表示にすることを抽象と呼びます。 (クラス「Car」に関連するプロパティのみを選択して、より抽象的または一般的にするようにします。)

  • カプセル化実装レベルでのデータの非表示です。実際に直接/外部アクセスからデータを隠す方法のように。これは、外部のアクセスを防ぐために、データとメソッドを単一のエンティティ/ユニットにバインドすることにより行われます。したがって、カプセル化は実装レベルでのデータ隠蔽とも呼ばれます。

0
CodeFu

抽象化

Javaでは、抽象化とは、情報を現実世界に隠すことを意味します。 「サービスを利用するために何をすべきか」を伝えるために、当事者間の契約を確立します。

例、API開発では、実際の実装ではなく、サービスの抽象化された情報のみが世界に公開されています。 Javaのインターフェースは、この概念を非常にうまく実現するのに役立ちます。

インターフェースは、生産者と消費者などの当事者間の契約を提供します。生産者は、製品の製造方法を消費者に知らせることなく商品を生産します。しかし、インターフェースを介して、Producerはすべての消費者にどの製品を購入できるかを知らせます。抽象化の助けを借りて、生産者は消費者に製品を販売できます。

カプセル化:

カプセル化は抽象化の1レベル下です。同じ製品会社は、お互いの生産グループから情報を保護しようとします。たとえば、会社がワインとチョコレートを生産している場合、カプセル化は、各製品が互いにどのように製造されているかを示す情報の保護に役立ちます。

  1. ワイン用とチョコレート用に個別のパッケージがあり、すべてのクラスがデフォルトのアクセス修飾子としてパッケージで宣言されている場合、すべてのクラスに対してパッケージレベルのカプセル化を行います。
  2. パッケージ内で、各クラス(メンバーフィールド)をprivateとして宣言し、それらのフィールドにアクセスするためのパブリックメソッドを持っている場合、この方法でそれらのフィールドにクラスレベルのカプセル化を提供します
0
Shaan