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


83

今日は面接をしました。カプセル化抽象の違いについて、OOPから質問がありましたか?

カプセル化は基本的にデータメンバーとメンバー関数をクラスと呼ばれる単一のユニットにバインドすることであるという私の知識に彼女に返信しました。一方、抽象化は基本的に実装の複雑さを隠し、ユーザーに簡単にアクセスできるようにすることです。彼女は私の答えで大丈夫だろうと思った。しかし、彼女は、両方の目的が情報を隠すことである場合、これら2つの実際の違いは何であるかを尋ねました。私は彼女に答えることができなかった。

この質問をする前に、これら2つのOOPの概念の違いについてStackOverFlowの他のスレッドを読みました。しかし、私は面接官を説得する立場に自分自身を見つけていません。

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


11
そして最後に、あなたは仕事を得ましたか?:)
エイドリアンKsiężarczyk

1
@WPFbee残念です!
Aimal Khan 2017

3
なぜ人々が抽象化とカプセル化を比較するのか分かりません。それらを2つの異なるOOP概念として受け入れることができないのはなぜですか。
ASquare氏2017


@WpfBee抽象化は非表示とは何の関係もありません。私の答えをチェックしてください
SVinesh19年

回答:


71

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

抽象化は何かを隠すためにも使用されますが、より高度なもの(クラス、インターフェース)です。クライアントは抽象クラス(またはインターフェース)を使用しますが、それが誰であるか、どちらであるかは気にせず、何ができるかを知る必要があります。


6
完璧です。あなたの答えは私のインタビュアーの質問をターゲットにしているように思えます。私はあなたの返事を実際的な例で繰り返し述べようとしています。それがあなたの返事を正当化するならば、私に知らせてください。テレビの例を見てみましょう。カプセル化とは、内部回路やLEDなどを組み合わせてテレビにすることです。抽象化とは、それを操作するために提供されるオンオフ、サウンド、チャネル設定、およびその他のボタンです。
wpfBee 2013年

みんなの抽象化は実装を隠すこととは何の関係もありません...抽象化はクラスと多形的に相互作用する方法です
Mortalus 2013年

1
@ Mortalus-「抽象化は実装を隠すこととは何の関係もない」というあなたの最初の声明に同意しません。抽象化の概念を学び始めるとき、私たちが最初に教えられているのは、実装の複雑さを隠し、それを使用するためのインターフェースをユーザーに提供することだと思います。ユーザーは実装の複雑さに興味がないかもしれないからです。あなたはテレビやエアコンの実用的な例を取ることができます。もう1つは、実装を隠さないのであれば、本体を持たない抽象クラスのメソッドを提供する理由です。ここでは、実装を明確に隠しています。
wpfBee 2013年

1
@ Mortalus-また、あなたはwikiリンクについて言及しました。最初のステートメント-「コンピュータサイエンスでは、抽象化とは、データとプログラムがその意味(セマンティクス)に似た形式の表現で定義され、実装の詳細が隠されるプロセスです。抽象化は、詳細を減らして除外しようとします。プログラマーは一度にいくつかの概念に集中することができます。」それ自体は、抽象化が実装を隠すことを目的としていることを示唆しています。私はあなたの2番目の声明に同意しますが、1番目の声明には同意しません。
wpfBee 2013年

1
カプセル化とは、単一のユニットを構築することであり、それを隠すかどうかはそれほど重要ではないと思います。抽象化は物事を隠すことに関するものですが、私が間違っている場合は訂正してください。
raj2 4019


12

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

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

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


11

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

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

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

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

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


7

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

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

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

カプセル化: 特定のクラスの実装の複雑さを、それを使用するクライアントから隠すプロセスです。「クライアント」は、クラスを作成した人のプログラムまたはイベントである可能性があることに注意してください。

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


1
抽象化は抽象クラスに関連していますか?
vishnu viswanath 2014

@vishnuviswanath、はい、抽象クラスとインターフェースを使用して抽象化を実装できます。
invzbl3

3

抽象化、カプセル化、情報隠蔽の違いに触れる素晴らしい記事がありますhttp//www.tonymarston.co.uk/php-mysql/abstraction.txt

これが記事からの結論です:

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


2

両方の違いは、 クライアントがロジックの内部ビューを見るのを防ぐことが目的である場合、データを非表示にするためにビューポイント
カプセル化ワードが使用されることです。

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

外の景色とは、

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

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


2

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

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

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


3
この回答が他の12の既存の回答とどのように異なるかを説明できますか?
スティーブンラウフ2018

2

カプセル化:

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

抽象化:

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


0

抽象化

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

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

インターフェースは、当事者、例、生産者と消費者の間の契約を提供します。生産者は、製品がどのように作られているかを消費者に知らせずに商品を生産します。しかし、プロデューサーはインターフェースを通じて、すべての消費者にどの製品が購入できるかを知らせます。抽象化の助けを借りて、生産者は製品を消費者に売り込むことができます。

カプセル化:

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

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

0

明確にするためにもう少しポイントがありますが、

データの抽象化と抽象クラスを混同してはなりません。彼らは違う。

一般的に、抽象クラスまたはメソッドは基本的に何かを隠すことであると言います。しかし、いいえ。それは間違っています。抽象という言葉はどういう意味ですか?グーグル検索は英語の単語の抽象化が意味すると言います

「思考またはアイデアとして存在しているが、物理的または具体的な存在を持っていない。」

そして、抽象クラスの場合もそうです。メソッドの内容を隠しているわけではありませんが、メソッドの内容はすでに空です(物理的または具体的な存在はありません)が、メソッドがどのようにあるべきか(思考またはアイデアとして存在する)、またはメソッドがカルスにあるべきかを決定します。

では、実際に抽象メソッドを使用するのはいつですか?

  • 基本クラスのメソッドが、それを拡張する子クラスごとに異なる場合。
  • したがって、子クラスにこの関数が実装されていることを確認する必要があります。
  • これにより、メソッドがのような強制的な署名を持つには、n個のパラメーターが必要になります。

抽象クラスについてです!-抽象クラスは、拡張のみでインスタンス化することはできません。しかし、なぜ ?

  • 抽象メソッドを持つクラスは、その中の抽象メソッドに意味のある実装がないため、独自のインスタンスを作成しないようにする必要があります。
  • 何らかの理由でそのクラスのインスタンスを持つことの意味が少ないことがわかった場合は、クラスを抽象化することもできます。

抽象クラスは、その新しいインスタンスの作成を回避するのに役立ちます。

クラスの抽象メソッドは、子クラスに、提供された署名を使用してその関数を確実に実装するように強制します。


0

上で説明したのと同じ例で説明します。同じテレビをご検討ください。

カプセル化:リモコンでできる調整は良い例です-音量の上下、色とコントラスト-提供されている最小値と最大値に調整するだけで、リモコンで提供されている以上のことはできません-ここでゲッターとセッターを想像してみてください(セッター関数は、指定された値が有効かどうかをチェックします。はいの場合、操作を処理します。そうでない場合は、変更を加えることができません。たとえば、音量を下げても音量をゼロより小さくすることはできません。ボタンを100回押します)。

抽象化:ここでも同じ例を取り上げることができますが、学位/コンテキストが高くなっています。音量を下げるボタンは音量を下げます-これはユーザーに提供する情報であり、ユーザーはリモコン内の赤外線送信機もテレビの受信機も、信号とマイクロプロセッサを解析する後続のプロセスを認識していませんテレビ内のアーキテクチャ。簡単に言えば、コンテキストでは必要ありません-必要なものを提供するだけです。ここで教科書の定義を簡単に関連付けることができます。つまり、内部実装を非表示にし、それがどのように行われるかではなく、何を行うかだけを提供します。

それが少し明確になることを願っています!


0

私がインタビューに直面したのであれば、エンドユーザーの観点から、抽象化とカプセル化はかなり同じだと思います。それは情報隠蔽に他なりません。ソフトウェア開発者の観点から、抽象化は設計レベルで問題を解決し、カプセル化は実装レベルで問題を解決します


0

簡単に言うAbstractionと、実装を非表示にし、クラスのインスタンスと対話できるようにインターフェイスを実装することで、クラスレベルで発生します。一方、Encapsulationは情報を隠すために使用されます。たとえば、メンバー変数をプライベートにして直接アクセスを禁止し、ゲッターとセッターを提供して間接アクセスを禁止します。


-2

抽象化:クラスの外部に公開する必要がある最小の関数と変数は何ですか。

カプセル化:この要件を達成する方法、つまりそれを実装する方法。


カプセル化は、抽象化を実現するための手段ではありません。それらは2つのわずかに異なる概念ですが、微妙なリンクがあります。
varsh

どちらも異なる概念ではないと思います。bezuは抽象クラスでカプセル化を実現できます。
K Kishore Kumar Reddy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.