79

私は面接の準備をしており、OOP の概念をブラッシュ アップすることにしました。利用可能な記事は何百もありますが、それぞれが異なる方法で説明しているようです。 ある人は言います

抽象化とは、「体系的なバリエーションを持つ一般的なパターンを特定するプロセスです。抽象化は、一般的なパターンを表し、使用するバリエーションを指定する手段を提供します」(Richard Gabriel)。

抽象クラスによって実現されます。

他の誰かが言う

抽象化とは、オブジェクトのクライアントに必要な詳細のみを表示することを意味します

Employee クラスに "CalculateSalary" メソッドがあるとします。このメソッドは EmployeeId をパラメーターとして取り、当月の従業員の給与を整数値として返します。誰かがその方法を使用したい場合。彼は従業員オブジェクトが給与を計算する方法を気にする必要はありませんか? 彼が気にする必要があるのは、メソッドの名前、その入力パラメーター、および結果のメンバーの形式だけです。

私は何度も何度もグーグルで検索しましたが、適切な答えが得られる結果はありませんでした。 では、カプセル化はこれらすべてのどこに当てはまりますか? スタックオーバーフローの質問 を検索して見つけました。その質問への答えでさえ混乱 ていた

カプセル化は、抽象化の一部として使用される戦略です。カプセル化とは、オブジェクトの状態を指します。オブジェクトはその状態をカプセル化し、外部から隠します。クラスの外部ユーザーは、そのメソッドを介してクラスと対話しますが、クラスの状態に直接アクセスすることはできません。そのため、クラスはその状態に関連する実装の詳細を抽象化します。

そして、ここで別の有名なメンバーは言います、

それらは異なる概念です。

抽象化とは、オブジェクトのすべての不要/重要でない属性を絞り込み、ドメインに最適な特性のみを保持するプロセスです。

今、私は全体の概念を台無しにしています。抽象クラス、継承、アクセス指定子などすべてについて知っています。インタビューで抽象化やカプセル化について尋ねられたとき、どう答えたらよいか知りたいだけです。

重複としてマークしないでください。私はいくつかの同様の質問があることを知っています。しかし、私は相反する説明の間の混乱を避けたいと思っています. 誰でも信頼できるリンクを提案できますか? 再び混乱が生じない限り、stackoverflow の質問へのリンクも歓迎します。:)

編集:私は答えが必要です。少しC#指向です

4

14 に答える 14

94

カプセル化: ゲッターやセッターなどを使用してデータを非表示にします。

抽象化: 抽象クラスやインターフェースなどを使用して実装を非表示にします。

于 2013-06-05T11:27:00.790 に答える
54

抽象化とは、オブジェクトのクライアントに必要な詳細のみを表示することを意味します

実際、それはカプセル化です。カプセル化とデータの隠蔽によって混乱しないように、ウィキペディアの記事の最初の部分も参照してください。http://en.wikipedia.org/wiki/Encapsulation_(オブジェクト指向プログラミング)

すべてのクラス メンバーをプロパティの背後に 1 対 1 で隠すだけでは、カプセル化にはならないことに注意してください。カプセル化とは、不変条件を保護し、実装の詳細を隠すことです。

ここにそれについての良い記事があります。 http://blog.ploeh.dk/2012/11/27/Encapsulationofproperties/ も、その記事にリンクされている記事を参照してください。

クラス、プロパティ、およびアクセス修飾子は、c# でカプセル化を提供するためのツールです。

複雑さを軽減するためにカプセル化を行います。

抽象化とは、「体系的なバリエーションを持つ一般的なパターンを特定するプロセスです。抽象化は、一般的なパターンを表し、使用するバリエーションを指定する手段を提供します」(Richard Gabriel)。

はい、それは抽象化の良い定義です。

それらは異なる概念です。抽象化とは、オブジェクトのすべての不要/重要でない属性を絞り込み、ドメインに最適な特性のみを保持するプロセスです。

はい、それらは異なる概念です。抽象化は実際には、オブジェクトを自分のドメインのみに適したものにすることの反対であることに注意してください。オブジェクトをドメイン全般に適したものにするためです。

実際の問題があり、特定のソリューションを提供する場合は、抽象化を使用して、同じ共通パターンを持つより多くの問題を解決できる、より一般的なソリューションを形式化できます。そうすれば、コンポーネントの再利用性を高めたり、同じドメインまたは異なるドメイン向けに作成された他のプログラマーによって作成されたコンポーネントを使用したりできます。

良い例は、リストやコレクションなど、.net フレームワークによって提供されるクラスです。これらは、ほとんどどこでも、多くのドメインで使用できる非常に抽象的なクラスです。.net が EmployeeList クラスと、特定のプロパティを持つ従業員と会社のリストのみを保持できる CompanyList のみを実装したとします。そのようなクラスは多くの場合役に立ちません。たとえば、CarList の機能全体を再実装する必要があるとしたら、それは大変なことです。したがって、「リスト」は、従業員、会社、および車から抽象化されています。List 自体は、独自のクラスで実装できる抽象概念です。

インターフェイス、抽象クラス、または継承とポリモーフィズムは、C# で抽象化を提供するためのツールです。

再利用性を提供するために抽象化を行います。

于 2013-06-05T13:20:15.037 に答える
27

カプセル化と抽象化を簡単な方法で説明しようと思います..見てみましょう..

  • データと関数を 1 つの単位 (クラスと呼ばれる) にまとめることは、カプセル化と呼ばれます。内部データ構造やコードなど、オブジェクトに関する情報を格納および非表示にするカプセル化。

カプセル化は -

  • 複雑さを隠し、
  • データと機能を結びつけ、
  • 複雑なメソッドの非公開化、
  • インスタンス変数をprivateにして、
  • 不要なデータと機能をエンド ユーザーから隠す。

カプセル化は抽象化を実装します。

そして抽象化は -

  • 必要なものを示し、
  • データはエンドユーザーから抽象化する必要があり、

例を見てみましょう -

以下の画像は、「データベースに追加される顧客の詳細」の GUI を示しています。

顧客画面 GUI

Image を見ると、Customer クラスが必要であることがわかります。

ステップ - 1: 私の顧客クラスには何が必要ですか?

すなわち

  • 顧客コードと顧客名を格納する 2 つの変数。

  • 1 顧客コードと顧客名をデータベースに追加する機能。

  namespace CustomerContent
    {
       public class Customer
       {
           public string CustomerCode = "";
           public string CustomerName = "";
           public void ADD()
           {
              //my DB code will go here
           }

ここでは、ADD メソッドのみが機能しません。

ステップ-2:検証はどのように機能しますか、ADD関数は機能しますか?

データベース接続コードと検証コード (追加メソッド) が必要です。

     public bool Validate()
     {
    //Granular Customer Code and Name
    return true;
     }

     public bool CreateDBObject()
     {
    //DB Connection Code
    return true;
     }


class Program
{
   static void main(String[] args)
   {
     CustomerComponent.Customer obj = new CustomerComponent.Customer;

     obj.CustomerCode = "s001";
     obj.CustomerName = "Mac";

     obj.Validate();
     obj.CreateDBObject();

     obj.ADD();
    }
}

これで、追加のメソッド ( Validate(); CreateDBObject()[複雑で追加のメソッド] ) をエンド ユーザーに表示する必要がなくなりました。エンド ユーザーは、顧客コード、顧客名、およびレコードを追加する [追加] ボタンを確認して知るだけで済みます.. エンド ユーザーどのようにデータをデータベースに追加するかは気にしません。

ステップ -3: エンド ユーザーの操作を伴わない余分で複雑なメソッドを非公開にします。

したがって、これらの複雑なメソッドと追加のメソッドをパブリックではなくプライベートとして作成し(つまり、これらのメソッドを非表示にします)obj.Validate(); obj.CreateDBObject();、クラス Program のメインから削除して、カプセル化を実現します。

つまり、エンド ユーザーへのインターフェイスを簡素化するのがカプセル化です。

したがって、完全なコードは次のようになります-

 namespace CustomerContent
 {
     public class Customer
     {
        public string CustomerCode = "";
        public string CustomerName = "";

        public void ADD()
        {
           //my DB code will go here
        }

        private bool Validate()
        {
           //Granular Customer Code and Name
           return true;
        }

        private bool CreateDBObject()
        {
           //DB Connection Code
           return true;
        }


  class Program
  {
     static void main(String[] args)
     {
        CustomerComponent.Customer obj = new CustomerComponent.Customer;

        obj.CustomerCode = "s001";

        obj.CustomerName = "Mac";

        obj.ADD();
   }
}

概要 :

ステップ -1 : 私の顧客クラスには何が必要ですか? は抽象化です。

ステップ -3 : ステップ -3: エンド ユーザーの操作を伴わない余分で複雑な方法を非公開にするのはカプセル化です。

PS - 上記のコードは難しくて速いです。

更新: このリンクには、サンプルを説明するビデオがあります: 抽象化とカプセル化の違いは何ですか

于 2014-11-18T19:32:27.683 に答える
14
于 2015-12-03T15:58:06.493 に答える
10

それらは少し異なる概念だと思いますが、しばしば一緒に適用されます。カプセル化は、呼び出し元から実装の詳細を隠すための手法ですが、抽象化は、理解を助けるために、使い慣れたオブジェクト/プロセスに類似したオブジェクトを作成することを含む設計哲学です。カプセル化は、抽象化を作成するために使用できる多くの手法の 1 つにすぎません。

たとえば、「窓」を取ります。これらは、従来の意味でのウィンドウではなく、画面上の単なるグラフィカルな四角形です。しかし、それらをウィンドウと考えると便利です。それは抽象化です。

「Windows API」が、テキストまたはグラフィックスがウィンドウの境界内で物理的にレンダリングされる方法の詳細を隠している場合、それはカプセル化です。

于 2013-06-05T11:51:39.243 に答える
4

私の2c

カプセル化の目的は、クラスのユーザーから実装の詳細を隠すことです。たとえば、クラス内のアイテムの std::list を内部的に保持し、std::vector がより効果的であると判断した場合、ユーザーなしでこれを変更できます。思いやり。つまり、いずれかの stl コンテナーと対話する方法は抽象化のおかげであり、たとえば、リストとベクターの両方を同様のメソッド (イテレーター) を使用して同じ方法でトラバースできます。

于 2013-06-05T12:08:42.000 に答える
3

1 つの例は、抽象化のコンテキストで常に私に持ち出されてきました。車のオートマチック トランスミッションとマニュアル トランスミッション。マニュアル トランスミッションは、ギアを変更する仕組みの一部を隠していますが、それでもドライバーとしてクラッチとシフトを行う必要があります。オートマチック トランスミッションは、ギアチェンジのすべての詳細をカプセル化します。

于 2013-06-05T12:05:22.037 に答える
0

私が知っているように、カプセル化はクラスのデータをそれ自体に隠し、外界からアクセスする必要がある場合にのみセッター/ゲッターを介してアクセスできるようにします。

抽象化は、それ自体のクラス設計です。

つまり、どのようにクラス ツリーを作成するか、どのメソッドが一般的なもので、どのメソッドが継承され、どのメソッドがオーバーライド可能か、どの属性がプライベート レベルまたは保護されているか、クラス継承ツリーをどのように構築するか、final を使用しますかクラス、抽象クラス、インターフェース実装。

抽象化は oo-design フェーズに位置付けられ、カプセル化も開発フェーズに登録されます。

于 2013-06-05T11:51:06.400 に答える
0

抽象化

Java では、抽象化とは、情報を現実の世界に隠すことを意味します。「サービスを利用するために何をすべきか」を伝える契約を当事者間で成立させます。

例、API 開発では、実際の実装ではなく、サービスの抽象化された情報のみが公開されています。Java のインターフェースは、この概念をうまく実現するのに役立ちます。

インターフェースは、プロデューサーとコンシューマーなどの当事者間の契約を提供します。生産者は、製品がどのように作られているかを消費者に知らずに商品を生産します。しかし、インターフェースを通じて、プロデューサーはすべての消費者にどの製品を購入できるかを知らせます。抽象化の助けを借りて、プロデューサーは製品を消費者に売り込むことができます。

カプセル化:

カプセル化は、抽象化の 1 レベル下にあります。同じ製品会社が、他の生産グループから情報を隠蔽しようとします。たとえば、会社がワインとチョコレートを製造している場合、カプセル化は、各製品がどのように製造されているかという情報を隠すのに役立ちます。

  1. ワイン用とチョコレート用の個別のパッケージがあり、すべてのクラスがデフォルトのアクセス修飾子としてパッケージで宣言されている場合、すべてのクラスにパッケージ レベルのカプセル化を提供します。
  2. パッケージ内で、各クラス フィールド (メンバー フィールド) をプライベートとして宣言し、それらのフィールドにアクセスするためのパブリック メソッドを使用すると、これらのフィールドにクラス レベルのカプセル化が与えられます。
于 2018-02-22T12:23:05.170 に答える
0

私はこのように考えています。カプセル化は何かが行われる方法を隠しています。これは、1 つまたは複数のアクションです。

抽象化は「なぜ」に関係しており、そもそもそれをカプセル化しています。

私は基本的にクライアントに「私がどのように支払いを処理し、送料を計算するかなどについてあまり知る必要はありません.「チェックアウト」したいことを私に伝えてください. ."

このようにして、Checkout リクエストに一般化 (抽象化) することで詳細をカプセル化しました。

抽象化とカプセル化は両立すると本当に思います。

于 2015-02-02T15:38:43.857 に答える