面接の準備をしているので、OOPの概念をブラッシュアップすることにしました。 何百もの記事がありますが、それぞれが違った説明をしているようです。 一部では
抽象化とは、システマティックなバリエーションを持つ共通のパターンを識別するプロセスである。 抽象化とは、システマティックなバリエーションを持つ共通のパターンを特定するプロセスであり、抽象化とは、共通のパターンを表現し 抽象化は、共通のパターンを表現し、どのバリエーションを使用するかを指定する手段を提供することである"(Richard
Gabriel)です。)
であり、抽象クラスによって実現されます。
あるその他では
抽象化とは、オブジェクトのクライアントに必要な詳細だけを見せることです。 オブジェクトの
と
例えば、Employeeクラスに、"CalculateSalary"というメソッドがあったとします。 このメソッドは、パラメータとしてEmployeeIdを受け取り、その従業員の当月の給与を整数値で返します。 このメソッドは、パラメータとしてEmployeeIdを受け取り、当月の従業員の給与を整数値で返します。さて、もし誰かが がそのメソッドを使いたいとします。がどのように給料を計算しているかを気にする必要はありません。 オブジェクトがどのように給料を計算するかを気にする必要はありません。唯一気にしなければならないのは メソッドの名前、入力パラメータ、結果のフォーマットです。 メンバーです。
何度も何度もググってみたのですが、どの結果も適切な答えが得られないようです。 さて、これらの中でカプセル化はどこに当てはまるのでしょうか。 検索してみると、stack overflow questionというのがありました。その質問に対する回答でさえも混乱していました。 ここには次のように書かれています。
カプセル化とは、抽象化の一部として使用される戦略である。カプセル化とは
オブジェクトの状態を指す - オブジェクトはその状態をカプセル化して オブジェクトはその状態をカプセル化して外部から隠蔽します。 クラスの外部ユーザーは、クラスのメソッドを通してクラスと対話しますが、クラスの状態に直接アクセスすることはできません。つまり クラスはその状態に関連する実装の詳細を抽象化しています。 状態に関連する実装の詳細を抽象化します。
また、こちら別の著名なメンバーが言っています。
それらは異なる概念です。
抽象化とは、オブジェクトの不要な属性や重要でない属性をすべて取り除き、必要な属性だけを残すプロセスです。 抽象化とは、オブジェクトの不要な属性や重要でない属性を取り除き 抽象化とは、オブジェクトの不要な属性や重要でない属性をすべて取り除き、 自分のドメインに最も適した特性だけを残すことです。
今、私は全体のコンセプトについて混乱しています。抽象クラス、継承、アクセス指定子などについては知っています。面接で抽象化やカプセル化について聞かれたとき、どのように答えればいいのかを知りたいのです。
Please don't mark it as a duplicate.同じような質問がいくつかあるのは知っています。しかし、私は矛盾した説明の中で混乱を避けたいのです。誰か信頼できるリンクを提案してくれませんか?スタックオーバーフローの質問へのリンクも、再び混乱を招かない限り歓迎します。)
EDIT: 答えが必要です、少しc#指向です。
この2つは微妙に異なる概念だと思いますが、しばしば一緒に適用されます。カプセル化とは、実装の詳細を呼び出し側から隠すための技術であり、抽象化とは、理解を助けるために、身近なオブジェクトやプロセスに類似したオブジェクトを作成するという設計哲学です。カプセル化は、抽象化を実現するための数多くのテクニックの一つに過ぎません。
例えば、ウィンドウを例に挙げてみましょう。これらは、伝統的な意味でのウィンドウではなく、画面上のグラフィカルな四角形に過ぎません。しかし、それをウィンドウと考えることは便利です。それが抽象化です。
もし、"windows API"が、ウィンドウの境界内でテキストやグラフィックがどのように物理的にレンダリングされるかの詳細を隠しているとしたら、それはカプセル化です。
私が知っている限りでは、カプセル化とは、クラスのデータをクラス自身の中に隠し、外部からアクセスしなければならない場合にのみ、セッターやゲッターを介してアクセスできるようにすることです。
抽象化とは、クラスを自分自身で設計することです。
つまり、どのようにクラスツリーを作成するか、どのメソッドが一般的なものか、どのメソッドが継承されているか、どのメソッドがオーバーライドできるか、どの属性がprivateレベルのみかprotectedレベルか、どのようにクラス継承ツリーを構築するか、finalクラスを使うか、abtractクラスを使うか、インターフェースを実装するか、などです。
抽象化は設計段階に多く、カプセル化は開発段階に多く含まれます。