79

OOP の概念を学び、特に抽象化とカプセル化を深く理解することに関心があります。

以下はすでにチェック済み

抽象化 VS 情報隠蔽 VS カプセル化

抽象化とカプセル化の違いは?

実際の単純なクラス/コード スニペットの例がなければ、これらの概念を理解するのは非常に難しいことがわかりました。

私の同僚の一人は、抽象化は抽象クラスを作成するだけであり、そのメンバー変数をスコープで保護する通常のクラスはカプセル化と呼ばれると言いました。

以下を繰り返すのではなく、私が理解し、他の人が彼らが何であるかを正確に理解するのを助ける簡単な方法はありますか?

抽象化とカプセル化は補完的な概念です。抽象化は、オブジェクトの観察可能な動作に焦点を当てています...カプセル化は、この動作を引き起こす実装に焦点を当てています...カプセル化は、ほとんどの場合、すべての情報を隠すプロセスである情報隠蔽によって達成されます本質的な特性に寄与しないオブジェクトの秘密。

4

16 に答える 16

176

抽象化とは、「関連する」データのみを表示し、オブジェクトの不要な詳細をユーザーから「隠す」プロセスです。あなたの携帯電話を考えてみてください。メッセージを送信したり電話をかけたりするためにどのボタンを押せばよいかを知る必要があるだけです。ユーザー。

カプセル化は、データと関数をクラスと呼ばれる単一のユニットに結合するプロセスです。カプセル化では、データは直接アクセスされません。クラス内に存在する関数を介してアクセスされます。簡単に言えば、クラスの属性は非公開に保たれ、これらの属性を操作するための public getter および setter メソッドが提供されます。したがって、カプセル化により、データ隠蔽の概念が可能になります。

ここに画像の説明を入力

于 2014-04-12T15:07:14.110 に答える
30

抽象化は、情報を隠したり、必要な詳細のみをクライアントに提供したりします。

例: 車のブレーキ - ペダルを踏むと車両が停止することはわかっていますが、内部でどのように機能するかを知る必要はありません。

抽象化の利点明日、ブレーキの実装がドラムブレーキからディスクブレーキに変更された場合、クライアントとして変更する必要はありません (つまり、コードは変更されません)。

カプセル化とは、データと動作を 1 つのユニットに結合することです。また、一部のコンポーネントへのアクセスを制限するための言語メカニズムでもあります (これは、private、protected などのアクセス修飾子によって実現できます)。

たとえば、クラスには属性 (つまりデータ) と動作 (つまり、そのデータを操作するメソッド) があります。

于 2013-04-15T11:49:13.510 に答える
16

C# を使用した例

//abstraction - exposing only the relevant behavior
public interface IMakeFire
{
     void LightFire();
}

//encapsulation - hiding things that the rest of the world doesn't need to see
public class Caveman: IMakeFire
{
     //exposed information  
     public string Name {get;set;}

     // exposed but unchangeable information
     public byte Age {get; private set;}

     //internal i.e hidden object detail. This can be changed freely, the outside world
     // doesn't know about it
     private bool CanMakeFire()
     {  
         return Age >7;
     }

     //implementation of a relevant feature
     public void LightFire()
     {
        if (!CanMakeFire())
        {
           throw new UnableToLightFireException("Too young");
        }
        GatherWood();
        GetFireStone();
        //light the fire

     }

     private GatherWood() {};
     private GetFireStone();
}

public class PersonWithMatch:IMakeFire
{
      //implementation
 }

IMakeFireの「機能」を実装しているため、穴居人なら誰でも火を起こすことができます。ファイヤーメーカーのグループ (リスト) があるということは、Caveman と PersonWithMatch の両方が有効な選択肢であることを意味します。

この意味は

  //this method (and class) isn't coupled to a Caveman or a PersonWithMatch
  // it can work with ANY object implementing IMakeFire
  public void FireStarter(IMakeFire starter)
  {
        starter.LightFire();
    }

したがって、多くの詳細 (プロパティ) と動作 (メソッド) を持つ多くの実装者を持つことができますが、このシナリオで問題になるのは、それらが発火する能力です。これが抽象化です。

火を起こすにはいくつかの手順 (GetWood など) が必要なため、これらはクラスの内部的な問題であるため、ビューから隠されています。穴居人には、外の世界から呼び出される可能性のある他の多くの公共の行動があります。ただし、内部作業に関連するため、一部の詳細は常に非表示になります。それらは非公開で、オブジェクトのためだけに存在し、公開されることはありません。これがカプセル化です

于 2013-04-15T13:16:01.857 に答える
9

抽象化は一般化された用語です。つまり、カプセル化は抽象化のサブセットです。

抽象化は、複雑なシステムを管理するための強力な方法論です。抽象化は、明確に定義されたオブジェクトとその階層分類によって管理されます。

たとえば、車自体は明確に定義されたオブジェクトであり、ギア システム、ステアリング メカニズム、エンジンなどの他のいくつかの小さなオブジェクトで構成されており、これらも独自のサブシステムを持っています。しかし、人間にとって車は 1 つのオブジェクトであり、内部の詳細が不明であっても、サブシステムの助けを借りて管理できます。 礼儀


カプセル化:データ メンバーとメソッドを 1 つのユニット (クラス) にまとめることをカプセル化と呼びます。

カプセル化は、カプセルに封入するようなものです。つまり、オブジェクトに関連する関連操作とデータをそのオブジェクトに囲みます。

カプセル化とは、ペンや本などを入れておくバッグのようなものです。これは、メンバーと関数をカプセル化するプロパティであることを意味します。

class Bag{
    book;
    pen;
    ReadBook();
}

カプセル化とは、オブジェクトの内部の詳細、つまりオブジェクトが何かを行う方法を隠すことを意味します。

カプセル化により、クライアントは、抽象化の動作が実装されている内部ビューを見ることができなくなります。

カプセル化は、オブジェクト内の情報を他のオブジェクトから保護するために使用される手法です。

変数を非公開にするなど、セキュリティのためにデータを非表示にし、プロパティを公開して、公開される非公開データにアクセスします。

そのため、プロパティにアクセスすると、データを検証して設定できます。 礼儀

于 2015-07-16T10:11:15.297 に答える
4

抽象化とは、設計でキャプチャ/表現する予定のエンティティから不要な詳細を「破棄」し、ドメインに関連するエンティティのプロパティのみを保持するプロセスです。
例: 車を表すには、モデルと価格、現在の場所と現在の速度などを保持し、色や座席数などは無視します。

カプセル化とは、単一の抽象化単位 (つまり、クラス) でそれらを操作するプロパティと操作の "バインド" です。
そのため、車はaccelarate stop位置や現在の速度などを操作 する必要があります.

于 2013-04-15T11:48:57.683 に答える
1

データの抽象化: 任意のクラスのデータ メンバーおよびメンバー関数へのアクセスは、単にデータの抽象化と呼ばれます.....

カプセル化: 変数と関数をバインドするか、データ メンバーまたはメンバー関数を 1 つの単位にまとめることができます。これは、データ カプセル化と呼ばれます。

于 2013-07-03T09:08:48.750 に答える
1

カプセル化は、データと機能を 1 つのユニットとして結合するために使用される包装紙と考えることができ、あらゆる種類の外部の汚れ (外部機能を意味します) からデータを保護します。

抽象化には、詳細の欠如と、複雑なシステムを制御するための単純なインターフェイスの使用が含まれます。

たとえば、根底にある電気工学 (抽象化) を気にすることなく、ボタンを押すだけで電球を点灯させることができます。

ただし、他の方法で電球を点灯させることはできません。(カプセル化)

于 2016-08-25T02:34:57.283 に答える
0
public abstract class Draw {
    public abstract void drawShape(); // this is abstraction.  Implementation detail need not to be known.
    // so we are providing only necessary detail by giving drawShape(); No implementation. Subclass will give detail.


    private int type;    // this variable cannot be set outside of the class. Because it is private.
    // Binding private instance variable with public setter/getter method is encapsulation 

    public int getType() { 
        return type;
    }

    public void setType(int type) {  // this is encapsulation. Protecting any value to be set.
        if (type >= 0 && type <= 3) {
            this.type = type;
        } else {
            System.out.println("We have four types only. Enter value between 0 to 4");
            try {
                throw new MyInvalidValueSetException();
            } catch (MyInvalidValueSetException e) {
                e.printStackTrace();
            }

        }
    }
}

Abstraction実装の詳細が不明なメソッドに関連しており、これは一種の実装隠蔽です。
Encapsulationメソッドを使用したインスタンス変数のバインド、一種のデータ隠蔽に関連しています。

于 2013-04-15T11:53:38.870 に答える