抽象化とカプセル化はどう違うのか?
疑問点
私は面接の準備をしており、OOPの概念をブラッシュアップすることにしました。 何百もの記事がありますが、それぞれが異なる説明をしているようです。 いくつかの は言う
<ブロッククオート抽象化とは、体系的なバリエーションを持つ共通のパターンを識別するプロセスです。 抽象化は、共通のパターンを表し、どのバリエーションを使用するかを指定する手段を提供します。 を表現し、どのバリエーションを使用するかを指定する手段を提供することである(Richard Gabriel)。
であり、抽象クラスによって実現される。
いくつかの その他 は言う
<ブロッククオート抽象化とは、オブジェクトのクライアントに対して、必要な詳細のみを表示することです。 オブジェクトの
と
Employee クラスにメソッド "CalculateSalary" があるとします。 このメソッドは EmployeeId をパラメータとして取り、当月の従業員の給与を整数値で返します。 このメソッドは EmployeeId をパラメータとして受け取り、当月の従業員の給与を整数値で返します。ここで、誰かが がこのメソッドを使用するとします。Employee オブジェクトがどのように給与を計算するかを気にする必要はありません。 オブジェクトがどのように給与を計算するのかを気にする必要はありません。その人が気にする必要があるのは メソッドの名前、入力パラメータ、および結果の形式です。 メンバの形式です。
何度も何度もググってみたのですが、どの結果も適切な答えが返ってこないようです。 さて、カプセル化はこれらすべてのどこに当てはまるのでしょうか? 検索してみると スタックオーバーフローの質問 . その質問に対する答えでさえ、混乱していた ここで と書いてある。
<ブロッククオートカプセル化は、抽象化の一部として使われる戦略です。カプセル化 オブジェクトはその状態をカプセル化し、外部から隠します。 クラスの外部のユーザーはそのメソッドを通してそのクラスと対話しますが、クラスの状態に直接アクセスすることはできません。 クラスの外部のユーザーは、メソッドを通してそのクラスと対話しますが、クラスの状態に直接アクセスすることはできません。つまり そのため、クラスはその状態に関連する実装の詳細を抽象化します。 状態に関する実装の詳細を抽象化します。
また ここで 別の評判の良いメンバーが言う。
それらは異なる概念です。
抽象化とは、オブジェクトの不要な属性や重要でない属性をすべて取り除き、必要なものだけを残すことです。 オブジェクトの不要な/重要でない属性をすべて取り除き、ドメインに最適な特性だけを残すプロセスです。 を残すことです。
今、私は全体のコンセプトについて混乱しています。私は抽象クラス、継承、アクセス指定子やすべてについて知っています。私はちょうど知りたいと思う 面接で抽象化やカプセル化について聞かれたとき、どう答えればいいのでしょうか?
重複としてマークしないでください。 . 似たような質問がいくつもあることは知っています。しかし、私は矛盾した説明の間の混乱を避けたいと思います。誰もが信頼できるリンクを提案することができますか?それが再び混乱を引き起こさない限り、stackoverflowの質問へのリンクも歓迎されます:)。
EDIT:私は答えを必要とする、少しC#指向。
どのように解決するには?
<ブロッククオート抽象化とは、オブジェクトのクライアントに必要な詳細のみを表示することです。
カプセル化とデータ隠蔽を混同しないように、wikipediaの記事の最初のほうも見てください。 http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
単にクラスのメンバーをプロパティの後ろに1対1で隠すことは、カプセル化ではないことに留意してください。
この件に関する良い記事があります。 http://blog.ploeh.dk/2012/11/27/Encapsulationofproperties/ にリンクされている記事も見てみてください。
クラス、プロパティ、アクセス修飾子は、C#でカプセル化を実現するためのツールです。
カプセル化を行うのは、複雑さを軽減するためです。
抽象化とは、体系的なバリエーションを持つ共通のパターンを識別するプロセスであり、抽象化は共通のパターンを表し、どのバリエーションを使用するかを指定するための手段を提供するものである。
はい、これは抽象化の良い定義です。
<ブロッククオートこれらは異なる概念です。 抽象化とは、オブジェクトの不要な/重要でない属性をすべて取り除き、ドメインに最適な特性だけを残すプロセスです。
抽象化とは、オブジェクトを自分のドメインだけに適したものにすることの逆であることを心に留めておいてください。
そうすれば、自分のコンポーネントの再利用性を高めたり、他のプログラマーが作った同じドメイン、あるいは異なるドメイン用のコンポーネントを使うことができます。
これらは非常に抽象的なクラスで、ほとんどどこでも、多くのドメインで使用することができます。.net が EmployeeList クラスと CompanyList のみを実装し、特定のプロパティを持つ従業員と会社のリストのみを保持できるとしたら、そのようなクラスは多くの場合役に立たなくなります。そこで、Employee、Company、Carからquot;List"を分離して抽象化したのです。リストはそれ自体が抽象的な概念であり、それ自身のクラスで実装することができます。
インターフェース、抽象クラス、継承、ポリモーフィズムは、C#で抽象化を実現するためのツールです。
再利用性を高めるために抽象化するのです。
関連
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] enumを列挙するには
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] カプセル化 vs 抽象化?
-
[解決済み] カプセル化と抽象化の違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] カプセル化 vs 抽象化?
-
[解決済み] カプセル化と抽象化の違い