抽象化とカプセル化の違いは?質問する

抽象化とカプセル化の違いは?質問する

カプセル化と抽象化の正確な違いは何ですか?

ベストアンサー1

ここでの回答のほとんどは OOP に焦点を当てていますが、カプセル化はもっと早い段階で始まります。

  • すべての機能はカプセル化; 擬似コードでは:

    point x = { 1, 4 }
    point y = { 23, 42 }
    
    numeric d = distance(x, y)
    

    ここでは、distance平面上の 2 点間の (ユークリッド) 距離の計算をカプセル化します。これにより、実装の詳細が隠されます。これが純粋で単純なカプセル化です。

  • 抽象化一般化のプロセスです。具体的な実装を、多少関連はあるものの、異なる種類のデータに適用できるようにします。抽象化の典型的な例は、C のqsortデータをソートする関数です。

    の重要な点は、qsortソートするデータについては気にしないということです。実際、ソートするデータが何であるかを知りませんvoid*。むしろ、その入力型は型なしのポインタ ( ) であり、これは単に C の「データの型は気にしない」という言い方です (これは型消去とも呼ばれます)。重要な点は、qsortデータ型に関係なく、 の実装は常に同じままであるということです。変更する必要があるのは、データ型ごとに異なる比較関数だけです。qsortしたがって、 では、ユーザーが関数の引数としてその比較関数を提供する必要があります。

カプセル化と抽象化は密接に関係しており、両者は切り離せないと言えるでしょう。実用上はおそらくその通りですが、ここでは抽象化とは言えないカプセル化を示します。

class point {
    numeric x
    numeric y
}

ポイントの座標をカプセル化しますが、論理的にグループ化する以外に、それらを物質的に抽象化することはしません。

以下はカプセル化ではない抽象化の例です。

T pi<T> = 3.1415926535

これは与えられた値(π)を持つ汎用変数 piであり、宣言では変数の正確な型は考慮されません。確かに、実際のコードでこのようなものを見つけるのは難しいでしょう。抽象化は事実上常にカプセル化を使用します。しかし、上記はC++(14)で実際に存在変数テンプレート(= 変数の汎用テンプレート)。構文は少し複雑です。例:

template <typename T> constexpr T pi = T{3.1415926535};

おすすめ記事