カプセル化と抽象化の正確な違いは何ですか?
ベストアンサー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};