1. ホーム
  2. java

[解決済み] カプセル化 vs 抽象化?

2022-05-14 16:20:22

質問

カプセル化と抽象化の簡単な定義は以下の通りです。

抽象化です。

Javaにおける抽象化のプロセスは、特定の詳細を隠し、オブジェクトの本質的な機能のみを表示するために使用されます。 オブジェクトの本質的な機能のみを表示するために使用されます。言い換えれば オブジェクトの外見 (インターフェイス) を扱います。 私がさまざまなサイトで見た唯一の良い例は インターフェイスです。

カプセル化です。

<ブロッククオート

カプセル化とは、基本的にオブジェクトの状態を隠すことです。 private, public, protected などの修飾子を用いてオブジェクトの状態を隠します。 公開メソッドで公開します。

のような修飾子で何を実現するのでしょうか? private , public という抽象化された概念で、外界の不要な部分を隠蔽することができます。

以上の説明から、カプセル化は抽象化の一部であり、抽象化のサブセットであることがわかります。しかし、抽象化だけで対処できるのに、なぜカプセル化という言葉が生まれたのでしょうか?私は、この2つを区別する大きな違いがあるはずだと確信していますが、ネット上の資料のほとんどは、この2つについてほとんど同じことを述べています。

この質問は以前にもこのフォーラムで提起されましたが、私は具体的な疑問を持って再びそれを投稿しています。いくつかの回答では、抽象化は概念であり、カプセル化は実装であるとも言っています。もしそれが本当なら、この 2 つの異なる概念は私たちを混乱させるために提供されていると考えることができます。

更新:-) 5年後、私はこの投稿と以下の回答に基づいて、要旨である私自身の答えを考え出しました。

  1. 抽象化とカプセル化の違い?
  2. カプセル化と抽象化の実際の例

どのように解決するのですか?

カプセル化 は、抽象化の一部として使用される戦略です。オブジェクトはその状態をカプセル化し、外部から隠します。クラスの外部のユーザーは、そのメソッドを通じてクラスと対話しますが、クラスの状態に直接アクセスすることはできません。そのため、クラス は抽象化された は、その状態に関連する実装の詳細から離れています。

抽象化 はより一般的な用語で、(とりわけ)サブクラス化することによっても実現できます。例えば、インターフェイス List は、位置によってインデックスが付けられたアイテムのシーケンスの抽象化であり、具体的な例として、標準ライブラリの List の具体例は ArrayList または LinkedList . を操作するコードは List と対話するコードは、それがどの種類のリストを使用しているかという詳細を抽象化します。

抽象化は、カプセル化によって基礎となる状態を隠さない限り、しばしば不可能です。クラスがその内部の状態を公開する場合、その内部の動作を変更することはできず、したがって抽象化することはできません。