130

今日は面接でした。EncapsulationAbstractionの違いについて、OOPから質問がありました。

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

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

最も簡単な例でそれを正当化できる人はいますか?

4

21 に答える 21

114

カプセル化は、部外者が直接アクセスするのを防ぐために、クラスで頻繁に変更される可能性のある変数または一部の実装を隠します。getter および setter メソッドを介してアクセスする必要があります。

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

于 2013-03-02T16:03:40.383 に答える
8

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

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

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

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

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

于 2013-03-02T16:00:07.647 に答える
7

抽象化、カプセル化、および情報の隠蔽の違いについて詳しく説明している素晴らしい記事があります: http://www.tonymarston.co.uk/php-mysql/abstraction.txt

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

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

于 2018-01-26T03:37:44.387 に答える
0

簡単に言えば、カプセル化はデータの隠蔽(情報隠蔽)であり、抽象化は詳細の隠蔽(実装の隠蔽)です。

于 2022-03-02T07:28:48.200 に答える
-1

物事を明確にするために、さらにいくつかのポイント、

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

一般に、抽象クラスまたはメソッドは、基本的に何かを隠すものだと言います。しかし、いいえ..それは間違っています。アブストラクトとはどういう意味ですか?Google 検索によると、英単語の抽象化は意味します

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

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

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

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

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

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

Abstract クラスは、その新しいインスタンスを作成するのを避けるのに役立ちます!

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

于 2019-04-04T07:34:07.177 に答える
-4

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

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

于 2016-12-07T12:57:17.373 に答える