1. ホーム
  2. c#

抽象化とカプセル化はどう違うのか?

2023-08-07 15:57:53

疑問点

私は面接の準備をしており、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#で抽象化を実現するためのツールです。

再利用性を高めるために抽象化するのです。