382

カプセル化と抽象化の正確な違いは何ですか?

4

40 に答える 40

283

ここでのほとんどの回答は OOP に焦点を当てていますが、カプセル化ははるかに早く始まります。

  • すべての関数はカプセル化されています。疑似コードで:

    point x = { 1, 4 }
    point y = { 23, 42 }
    
    numeric d = distance(x, y)
    

    ここでdistanceは、平面内の 2 点間の (ユークリッド) 距離の計算をカプセル化します。実装の詳細は隠されています。これは純粋でシンプルなカプセル化です。

  • 抽象化は一般化のプロセスです。具体的な実装を取り、それをさまざまな、しかし多少関連するデータ型に適用できるようにします。抽象化の古典的な例は、qsortデータをソートする C の関数です。

    問題qsortは、並べ替えるデータを気にしないということです。実際、どのデータを並べ替えるかはわかりません。むしろ、その入力型は型のないポインター ( void*) であり、これは単に「データの型は気にしない」という C の言い方です (これは型消去とも呼ばれます)。重要な点は、qsortデータ型に関係なく、 の実装は常に同じままであるということです。変更する必要があるのは、データ型ごとに異なる比較関数だけです。qsortしたがって、ユーザーが上記の比較関数を関数引数として提供することを期待しています。

カプセル化と抽象化は非常に密接に関連しているため、それらは本当に切り離せないものであると言えます。実際には、これはおそらく真実です。とはいえ、あまり抽象化されていないカプセル化は次のとおりです。

class point {
    numeric x
    numeric y
}

ポイントの座標をカプセル化しますが、論理的にグループ化する以外に、それらを実質的に抽象化することはしません。

そして、カプセル化ではない抽象化の例を次に示します。

T pi<T> = 3.1415926535

これは、特定の値 (π) を持つジェネリック変数 piであり、宣言では変数の正確な型は考慮されません。確かに、実際のコードでこのようなものを見つけるのは難しいでしょう。抽象化では、実質的に常にカプセル化が使用されます。ただし、変数テンプレート(= 変数の汎用テンプレート) を介して、上記実際には C++(14) に存在します。少し複雑な構文を使用します。たとえば、次のようになります。

template <typename T> constexpr T pi = T{3.1415926535};
于 2009-04-13T12:02:28.450 に答える
162

多くの回答とその例は誤解を招くものです。

カプセル化とは、「データ」「そのデータを操作する関数」を 1 つのコンポーネントにまとめて、オブジェクトのコンポーネントの一部へのアクセスを制限することです。
カプセル化とは、オブジェクトの内部表現が、通常、オブジェクトの定義の外では見えないように隠されていることを意味します。

抽象化は、実装の詳細を含めずに本質的な機能を表すメカニズムです。

カプセル化: --情報の隠蔽
抽象化: --実装の隠蔽

例 (C++):

class foo{
    private:
        int a, b;
    public:
        foo(int x=0, int y=0): a(x), b(y) {}

        int add(){    
            return a+b;   
        } 
}  

クラスのオブジェクトの内部表現はfoo、クラスの外に隠されています。--> カプセル化。
のオブジェクトのアクセス可能なメンバー (データ/関数)fooは制限されており、そのオブジェクトのみがアクセスできます。

foo foo_obj(3, 4);
int sum = foo_obj.add();

メソッドの実装addは隠されています。--> 抽象化。

于 2015-03-24T04:04:41.660 に答える
140

カプセル化とは、実装の詳細を隠していることです。これは、一般的な動作または特殊な動作の場合とそうでない場合があります。

抽象化は一般化を提供します(たとえば、一連の動作に対して)。

ここに良い読み物があります:オブジェクトエージェンシーのエドワードV.ベラールによる抽象化、カプセル化、および情報隠蔽。

于 2009-04-12T20:20:16.297 に答える
107

カプセル化は、いくつかのものを箱に入れ、のぞき穴を与えます。これにより、ギアをいじるのを防ぐことができます。

抽象化は、物事にギア、ラチェット、フライホイール、または核コアがあるかどうかなど、重要ではない詳細を無視します。彼らはただ「行く」

カプセル化の例:

  • パンツ
  • ツールボックス
  • 財布
  • ハンドバッグ
  • カプセル
  • 冷凍カーボナイト
  • ボタンの有無にかかわらず箱
  • ブリトー(技術的には、ブリトーの周りのトルティーヤ)

抽象化の例:

  • 「物事のグループ」は抽象化です(これを集約と呼びます)
  • 「他のものを含むもの」は抽象化です (これを合成と呼びます)
  • 「コンテナ」は、別の種類の「他のものを含むもの」の抽象化です。カプセル化の例はすべてコンテナの一種ですが、すべてのコンテナがカプセル化を示す/提供するわけではないことに注意してください。たとえば、バスケットは、内容物をカプセル化しないコンテナです。
于 2009-04-12T22:10:58.713 に答える
71

カプセル化とは、ゲッターやセッターなどを使用してデータを隠すことを意味します。

抽象化とは、抽象クラスやインターフェースなどを使用して実装を隠すことを意味します。

于 2012-11-27T17:29:55.933 に答える
41

上記には多くの良い回答が提供されていますが、ここでは私の(Java)視点を紹介します。

データのカプセル化とは、論理的にグループ化されたデータをクラスにラップしてアクセスを制御することを意味します。一般に、別のキーワードであるData Hidingに関連付けられています。これは、アクセス修飾子を使用して Java で実現されます。

簡単な例としては、プライベート変数を定義し、getter および setter メソッドを使用してアクセスできるようにするか、クラス内でのみ使用されるメソッドをプライベートにすることです。ユーザーがこれらのメソッドと変数について知る必要はありません。

: カプセル化はすべてデータの隠蔽のみを目的としていると誤解してはなりません。カプセル化と言うときは、関連するデータと動作をグループ化、パッケージ化、またはバンドルすることに重点を置く必要があります。

一方、データの抽象化は、複雑なロジックがユーザーに公開されないように一般化するという概念です。Java では、これはインターフェイス抽象クラスを使用して実現されます。

例 -

インターフェース Animalがあり、関数makeSound ()があるとしましょう。このインターフェースを実装する 2 つの具象クラスDogCatがあります。これらの具体的なクラスには、makeSound() 関数の個別の実装があります。ここで、動物がいるとしましょう (これは外部モジュールから取得します)。ユーザーが知っているのは、受信しているオブジェクトが動物であり、動物の音を出力するのはユーザーの責任であることだけです。強引な方法の 1 つは、受け取ったオブジェクトをチェックしてその型を識別し、それをその Animal 型に型キャストしてから、 makeSound() を呼び出すことです。しかし、もっときちんとした方法は、物事を抽象化することです。動物をポリモーフィック参照を作成し、その上で makeSound() を呼び出します。実際のオブジェクトの種類に応じて、実行時に適切な関数が呼び出されます。

詳細はこちら

ここに画像の説明を入力

複雑なロジックは、タッチパッドにカプセル化された回路基板にあり、それをユーザーに抽象化するための優れたインターフェイス (ボタン) が提供されます。

PS: 上記のリンクは私の個人的なブログです。

于 2014-01-04T19:13:57.117 に答える
33

これらはややあいまいな概念であり、コンピューター サイエンスやプログラミングに固有のものではありません。他の人がこれらの重要な概念を理解するのに役立つかもしれないいくつかの追加の考えを提供したいと思います.


簡潔な答え

カプセル化- システムの特定の部分へのアクセスを隠したり制限したりしながら、必要なインターフェイスを公開します。

抽象化- 具体的な現実、特定のオブジェクト、または実際のインスタンスとは別に、特定の特性を取り除いて何かを検討することで、複雑さを軽減します。

主な類似点は、これらの手法が理解と有用性の向上を目指していることです。

主な違いは、抽象化は物事をより単純に表現する手段であり (多くの場合、表現をより広く適用できるようにするため)、カプセル化は他のものと何かが相互作用する方法を変更する方法です。


長い答え

カプセル化

以下は、うまくいけば物事をより明確にするカプセル化の例です。

Arduinoカプセル化

ここにはArduino Uno と、筐体内の Arduino Uno があります。エンクロージャは、カプセル化とは何かをよく表しています。

カプセル化の目的は、特定のコンポーネントを外部の影響や知識から保護することと、他のものがインターフェイスする必要があるコンポーネントを公開することです。プログラミング用語では、これにはアクセス修飾子による情報隠蔽が含まれます。アクセス修飾子は、特定の変数やプロパティを読み書きできる範囲を変更します。

しかし、カプセル化は、これらの外部インターフェイスをより効果的に提供することも目的としています。Arduino の例では、ユーザーのデバイスとのやり取りをより簡単にする素敵なボタンと画面を含めることができます。これらは、デバイスの動作に影響を与える簡単な方法をユーザーに提供し、それ以外の場合ははるかに困難な操作に関する有用な情報を取得します。

プログラミングでは、さまざまなコンポーネントを 、 、 などの分離可能な構造にグループ化する必要がfunctionありclassますobject。また、それらの構成要素と対話する手段、およびそれらに関する有用な情報を取得する方法の提供も含まれます。

カプセル化は、コードの保守性とテスト容易性の向上だけでなく、さまざまな方法でプログラマーを支援します。

抽象化

ここでの他の多くの回答は抽象化を一般化として定義していますが、個人的には定義が間違っていると思います。一般化は実際には特定のタイプの抽象化であり、その逆ではないと思います。つまり、すべての一般化は抽象化ですが、すべての抽象化が必ずしも一般化であるとは限りません

私が抽象化について考えるのが好きな方法は次のとおりです。

ピクセル ツリー

そこにあるイメージは木だと思いますか。あなたがそうする可能性があります。しかし、それは本当に木ですか?もちろん、そうではありません!これは、ツリーと呼ばれるもののように見えるように作成されたピクセルの集まりです。これは、実際の木の抽象化を表していると言えます。ツリーのいくつかの視覚的な詳細が省略されていることに注意してください。また、成長したり、水を消費したり、酸素を生成したりしません。どうして?これは、コンピューターのメモリ内のバイト数で表される、画面上の単なる色の集まりです。

そして、ここに抽象化の本質があります。物事を単純化して理解しやすくする方法です。頭の中を駆け巡るすべてのアイデアは、現実の抽象化です。木に対するあなたのイメージは、この jpeg と同じように実際の木ではありません。

プログラミングでは、Treeシミュレートされた成長、水の消費、および酸素の生成のためのメソッドを備えたクラスを作成することにより、これを有利に利用できます。私たちの作成は、実際の木の経験を表すものであり、特定のシミュレーションで本当に気にかけている要素のみを含みます。私たちは、何かの経験をバイトと数学で表現する方法として抽象化を使用します。

抽象クラス

プログラミングにおける抽象化により、いくつかの「具体的な」オブジェクト タイプ (実際に存在するタイプ) 間の共通性を考慮し、それらの共通性を一意のエンティティ内で定義することもできます。たとえば、私たちのクラスは、すべての植物のようなクラスに適用できるいくつかのプロパティとメソッドを持つTreeから継承できますが、植物の各タイプに固有のものは削除されます。これにより、コードの重複が大幅に削減され、保守性が向上します。abstract class Plant

abstract classとプレーンの実際的な違いはclass、概念的には の「実際の」インスタンスがないことabstract classです。Plantそれは十分に具体的ではないため、オブジェクトを作成しても意味がありません。すべての「実」Plantは、 のより具体的なタイプでもありPlantます。

また、プログラムをより現実的にしたい場合は、Treeクラス自体が抽象的すぎる可能性があるという事実を考慮する必要があります。実際には、 everyTreeは のより具体的な型であるため、おそらく現在の のクラスから継承する、などTreeの型のクラスを作成できます。BirchMapleabstractTree

JVM

抽象化のもう 1 つの良い例はJava 仮想マシン (JVM)です。これは、Java コードを実行するための仮想または抽象コンピューターを提供します。それは基本的に、システムのプラットフォーム固有のコンポーネントをすべて取り除き、特定のシステムに関係なく「コンピューター」の抽象的なインターフェースを提供します。

違い

カプセル化は、何かが「本物」または「正確」であることに何の関係もないという点で、抽象化とは異なります。より単純にしたり、より広く適用できるようにするために、何かのコンポーネントを削除するわけではありません。むしろ、同様の目的を達成するために特定のコンポーネントを非表示にする場合があります。

于 2015-12-26T05:16:49.460 に答える
29
  • 抽象化により、オブジェクトがどのように実行するかではなく、オブジェクトが何を実行するかに焦点を当てることができます
  • カプセル化とは、オブジェクトが何かを実行する方法の内部の詳細またはメカニズムを非表示にすることを意味します。

車を運転するときのように、アクセルペダルが何をするかは知っていますが、カプセル化されているため、アクセルペダルの背後にあるプロセスがわからない場合があります。

C#で例を挙げましょう。あなたが整数を持っていると仮定します:

int Number = 5;
string aStrNumber = Number.ToString();

Number.ToString()のようなメソッドを使用して、数値5の文字表現を返し、それを文字列オブジェクトに格納できます。このメソッドは、どのように実行するかではなく、何を実行するかを示します。

于 2009-04-12T20:22:35.980 に答える
14

抽象化とカプセル化の違い。

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

于 2014-08-30T00:07:41.277 に答える
12

抽象化:単純化された/異なる方法で何かを提示するという考え。これは、理解しやすく、使用しやすいか、状況により適しています。

メールを送信するクラスを考えてみましょう...抽象化を使用して、ある種のメッセンジャーボーイとして自分自身を表示するため、emailSender.send(メール、受信者)を呼び出すことができます。実際に行うこと - POP3 / SMTP の選択、サーバーの呼び出し、MIME 変換などは抽象化されています。あなたはあなたのメッセンジャーの男の子だけを見ます。

カプセル化:オブジェクトにプライベートなデータとメソッドを保護して隠すという考え方。それは、何かを独立した誰にでもできるものにすることをより扱います。

たとえば、私を連れて行ってください。他の世界からの心拍数をカプセル化します。他の誰かがその変数を変更したくないので、私が機能するために他の誰かがそれを設定する必要はありません。それは私にとって非常に重要ですが、それが何であるかを知る必要はありませんし、とにかく気にしないでしょう.

周りを見渡すと、触れるほとんどすべてが抽象化とカプセル化の両方の例であることがわかります。たとえば、あなたの携帯電話は、GSM、プロセッサ アーキテクチャ、無線周波数、およびあなたが理解していない、または気にかけない他の何百万ものことをカバーして、あなたが言うことを他の誰かに伝えることができるという抽象化をあなたに提示します. また、シリアル番号、ID 番号、周波数など、特定のデータをカプセル化します。

それはすべて、世界をより住みやすい場所にします:D

于 2009-12-18T10:58:07.267 に答える
10

抽象化:必要な情報のみが表示されます。コンピュータの電源を入れる例に焦点を当てましょう。ユーザーは、システムがまだロードされている間に何が起こっているかを知る必要はありません(その情報はユーザーから隠されています)。

別の例、ATMの例を見てみましょう。顧客は、マシンがPINを読み取り、トランザクションを処理する方法を知る必要はありません。必要なのは、PINを入力し、現金を受け取り、離れるだけです。

カプセル化:クラスの機密データを非表示にして、その一部を民営化することを扱います。これは、外部からのアクセスを許可しないことにより、一部の情報をクライアントに対して非公開にする方法です。

于 2011-02-11T11:12:50.080 に答える
8

抽象化 :What抽象化とは、機能の一部を示すことを意味します。

カプセル化 :Howカプセル化とは、機能の一部を隠すことを意味します。

非常に簡単な例を見てみましょう

/// <summary>
/// We have an Employee class having two properties EmployeeName and EmployeeCode
/// </summary>
public class Employee
{
    public string EmplpyeeName { get; set; }
    public string EmployeeCode { get; set; }

    // Add new employee to DB is the main functionality, so are making it public so that we can expose it to external environment
    // This is ABSTRACTION
    public void AddEmployee(Employee obj)
    {
        // "Creation of DB connection" and "To check if employee exists" are internal details which we have hide from external environment
        // You can see that these methods are private, external environment just need "What" part only
        CreateDBConnection();
        CheckIfEmployeeExists();
    }


    // ENCAPLUSATION using private keyword
    private bool CheckIfEmployeeExists()
    {
        // Here we can validate if the employee already exists
        return true;
    }

    // ENCAPLUSATION using private keyword
    private void CreateDBConnection()
    {
        // Create DB connection code
    }
}

コンソール アプリケーションのプログラム クラス

class Program
{
    static void Main(string[] args)
    {
        Employee obj = new Employee();
        obj.EmplpyeeName = "001";
        obj.EmployeeCode = "Raj";

        // We have exposed only what part of the functionality
        obj.AddEmployee(obj);
    }
}
于 2015-06-08T09:25:39.257 に答える
8

AbstractionそしてEncapsulation、単一の一般化された例を使用して

-------------------------------------------------- -------------------------------------------------- --------------------------------

私たちは皆、複雑な問題の計算に電卓を使用しています。

画像

于 2013-08-26T10:50:16.320 に答える
7

特定のオブジェクトのデータが、外部関数による意図的または偶発的な誤用から安全に保護されるメカニズムは、「データのカプセル化」と呼ばれます。

背景の詳細​​や説明を含めずに本質的な機能を表す行為は、抽象化として知られています。

于 2011-10-17T15:39:07.257 に答える
6

スタックの例を見てみましょう。配列またはリンクされたリストを使用して実装できます。ただし、サポートされる操作はプッシュとポップです。

現在、抽象化はインターフェイスの push と pop のみを公開しています。基礎となる表現は隠され (配列か連結リストか?)、明確に定義されたインターフェースが提供されます。では、抽象化されたデータに誤ってアクセスしないようにするにはどうすればよいでしょうか? そこでカプセル化の出番です。たとえば、C++ のクラスでは、アクセス指定子を使用して、偶発的なアクセスや変更を防止します。また、上記のインターフェイスをパブリックにすることで、スタックを操作する唯一の方法が明確に定義されたインターフェイスを介することになります。その過程で、データとそれを操作できるコードが結合されます (ここでは、フレンド関数は使用しないでください)。つまり、コードとデータは結合されるか、結び付けられるか、カプセル化されます。

于 2011-11-03T16:33:50.477 に答える
5

カプセル化とは、複雑さをクラスである1つのカプセルにまとめることであり、したがってカプセル化です。抽象化は、他のオブジェクトとは異なるオブジェクトの特性です。

抽象化は、1つ以上のメソッドを抽象化するクラスabstractを作成することで実現できます。これは、それを拡張するクラスによって実装されるべき特性に他なりません。たとえば、車を発明/設計するときは、車に4つのドア、ブレーキ、ハンドルなどが必要であるなどの特性を定義します。したがって、この設計を使用する人は、この特性を含める必要があります。実装は抽象化のそれぞれの頭ではありません。含めるべき特性を定義するだけです。

カプセル化は、データと動作をクラスである1つのカプセルに保持し、継承、集約、または構成とともに、パブリック、プライベート、保護などのアクセス修飾子を使用することによって実現されます。したがって、必要なものだけを表示します。それも、表示したい範囲でのみ表示します。すなわち、公的、保護された、友好的で私的なkafunda……例えばGMは上記の車の抽象化されたデザインを使用することを決定します。しかし、それらには同じ特性を持ち、ほぼ同じ機能を実行するさまざまな製品があります。したがって、彼らは上記の抽象クラスを拡張するクラスを作成します。それは、ギアボックスがどのように機能するか、ブレークがどのように機能するか、ステアリングホイールがどのように機能するかを示しています。次に、すべての製品がこの共通の機能を使用します。彼らは、ギアボックスがどのように機能するか、ブレーキが機能するか、ステアリングホイールがどのように機能するかを知る必要はありません。

どちらも強力です。しかし、抽象化を使用するには、カプセル化よりも多くのスキルが必要であり、より大きなアプリケーション/製品は、抽象化なしでは生き残れません。

于 2011-06-01T06:39:21.920 に答える
5

抽象化--- 実装の隠蔽--設計時---インターフェース/抽象呼び出しの使用

カプセル化 -- データの隠蔽 -- 開発時 --- アクセス修飾子 (public/private) の使用

于 2015-07-13T05:13:46.277 に答える
5

簡単な方法でカプセル化のデモを試みます..見てみましょう..

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

カプセル化は -

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

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

そして抽象化は -

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

例を見てみましょう -

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

顧客画面 GUI

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

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

すなわち

  • 顧客コードと顧客名を格納する 2 つの変数。
  • 1 顧客コードと顧客名をデータベースに追加する機能。

    名前空間 CustomerContent { public class Customer { public string CustomerCode = ""; public string CustomerName = ""; public void ADD() { //DB コードをここに記述します }

ここでは、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();
}
}

これで、Extra Methods(Validate(); CreateDBObject() [Complicated and Extra method] ) をエンド ユーザーに表示する必要がなくなりました。エンド ユーザーは、顧客コード、顧客名、および ADD を実行する [ADD] ボタンを確認して知るだけで済みます。レコード..エンドユーザーは、データをデータベースに追加する方法を気にしませんか?.

ステップ -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:45:07.283 に答える
4

以下の段落は、それらが互いにどのように異なるかを理解するのに役立ちました。

データのカプセル化は、データを束ねるメカニズムであり、それらを使用する関数とデータの抽象化は、インターフェイスのみを公開し、実装の詳細をユーザーから隠すメカニズムです。

詳しくはこちらをご覧ください

于 2016-12-10T10:48:05.863 に答える
3

情報隠蔽は、抽象化またはカプセル化に厳密には必要ありません。情報は無視されるかもしれませんが、隠す必要はありません。

カプセル化 とは、多くの複雑な部品やアイデアで構成されている場合でも、何かを 1 つのものとして扱う能力です。たとえば、私は「椅子」に座っていると言うことができますが、その椅子の多くのさまざまな部分がそれぞれ特定のデザインと機能を備えており、すべてが正確にフィットして、お尻を数フィート快適に保持できるようになっているとは言えません。床から離れます。

抽象化はカプセル化によって有効になります。オブジェクトをカプセル化しているため、内部オブジェクト構造の微妙な詳細に行き詰まるのではなく、オブジェクトを何らかの方法で相互に関連するものとして考えることができます。抽象化とは、細部への関心から解放され、全体像を検討する能力です。単語の語根は、学術論文の上部にある要約のように抽象的であり、派生サブクラスとしてのみインスタンス化できるクラスのように抽象的ではありません。

正直に言うと、椅子に腰を下ろしたとき、その椅子の構造がどのように体重を支え、保持するかについて考えたことはありません。そんな細かいことを気にしなくてもいい椅子です。だから私は自分のコンピュータに注意を向けることができます。繰り返しになりますが、コンピューターの構成部品については考えていません。私は、入力できるテキスト領域を表すウェブページの一部を見ているだけで、言葉でコミュニケーションを取っているだけで、私の指がキーボード上で正しい文字を常にすばやく見つける方法や、どのように最終的には、これらのキーをタップしてからこのフォーラムに投稿するまでの間に接続が確立されます。これが抽象化の大きな力です。システムの下位レベルは、一貫性と正確さで動作すると信頼できるため、より大きな作業のために余裕を持って注意を払っています。

于 2013-08-26T16:58:20.607 に答える
2

抽象化は役に立たないデータをユーザーから隠し、カプセル化はデータをカプセル (クラス) にバインドします。カプセル化は、抽象化を実現する方法だと思います。

于 2011-07-06T11:55:13.103 に答える
2
class Aeroplane : IFlyable, IFuelable, IMachine
{ // Aeroplane's Design says:
  // Aeroplane is a flying object
  // Aeroplane can be fueled
  // Aeroplane is a Machine
}
// But the code related to Pilot, or Driver of Aeroplane is not bothered 
// about Machine or Fuel. Hence,
// pilot code:
IFlyable flyingObj = new Aeroplane();
flyingObj.Fly();
// fighter Pilot related code
IFlyable flyingObj2 = new FighterAeroplane();
flyingObj2.Fly();
// UFO related code 
IFlyable ufoObj = new UFO();
ufoObj.Fly();
// **All the 3 Above codes are genaralized using IFlyable,
// Interface Abstraction**
// Fly related code knows how to fly, irrespective of the type of 
// flying object they are.

// Similarly, Fuel related code:
// Fueling an Aeroplane
IFuelable fuelableObj = new Aeroplane();
fuelableObj.FillFuel();
// Fueling a Car
IFuelable fuelableObj2 = new Car(); // class Car : IFuelable { }
fuelableObj2.FillFuel();

// ** Fueling code does not need know what kind of vehicle it is, so far 
// as it can Fill Fuel**
于 2011-04-06T10:57:44.993 に答える
2

Abstraction私たちがやろうとしている実装のための契約です。実装は、時間の経過とともに変更される可能性があります。さまざまな実装自体が隠されている場合と隠されていない場合がありますが、抽象化の背後でマスクされています。

APIsでクラスのすべてを定義し、interfaceコードのユーザーに の定義に依存するように依頼するとしAPIsますinterface。設定された契約に従う必要がある場合にのみ、実装を自由に改善または変更できます。ユーザーは私たちの実装に結び付けられていません。

必要なすべてのルール (メソッド) を抽象化で公開します。ルールの実装は実装エンティティに任され、実装は抽象化の一部ではありません。抽象化を行うのは署名宣言だけです。

Encapsulation状態と動作のアクセスを減らすことにより、内部の詳細を単純に隠しています。カプセル化されたクラスは、適切に定義されている場合とされていない場合がありますAbstraction

java.util.Listの抽象化ですjava.util.ArrayList。アクセス修飾子java.util.ArrayListでマークされている内部状態はカプセル化です。non public

編集 クラスがContainer.nava implements IContainer、、などのIContainerメソッドを宣言するとします。ここでは、その実装クラスの抽象化を表します。抽象化とは、クラスまたはモジュールまたはシステムの API を外界に宣言することです。これらの API は になります。そのシステムは、まだ開発されているかもしれないし、開発されていないかもしれません。システムのユーザーは、宣言された API に依存できるようになり、そのようなコントラクトを実装するシステムは常に宣言された API に準拠し、それらの API の tge 実装を常に提供することを確信できます。具体的なエンティティを作成したら、内部状態を非表示にすることを決定するのはカプセル化ですaddElementremoveElementscontainsIContainercontract

于 2017-04-20T16:03:07.747 に答える
1

読めば読むほど迷いました。だから、ここに私が理解したことがあります:

カプセル化:

私たちは通常、時計を外から見ますが、その部品は本体の中にカプセル化されています。さまざまな操作に対して何らかの制御を行っています。詳細を隠し、コントロール (時間の設定など) を公開するこの方法は、カプセル化です。

抽象化:

ここまで時計の話でした。しかし、どのような時計かは特定しませんでした。デジタルでもアナログでも、手でも壁でもかまいません。多くの可能性があります。私たちが知っているのは、それが時計であり、時間を伝えるということです。私たちが興味を持っているのは時間だけです。詳細を隠し、一般的な機能やユースケースを公開するこの方法は、抽象化です。

于 2021-10-18T18:51:07.097 に答える
1

抽象化とカプセル化はどちらもデータの隠蔽で知られています。しかし、大きな違いがあります。

カプセル化

カプセル化とは、データとデータを操作するコードを、クラスと呼ばれる単一の単位にバインドまたはラップするプロセスです。

カプセル化は、実装レベルで問題を解決します。

クラスでは、private または protected アクセス修飾子を使用してデータを非表示にできます。

抽象化

抽象化とは、無関係な詳細を隠すという概念です。つまり、不要な詳細をユーザーから隠すことで、複雑なシステムをシンプルにします。

抽象化は、設計レベルで問題を解決します。

Java でインターフェイスと抽象クラスを作成することで、抽象化を実現できます。

ruby では、モジュールを作成することで抽象化を実現できます。

例: Ruby で Array と Hash を使用して Enumerable モジュールの (collect、map、reduce、sort...) メソッドを使用します。

于 2018-08-04T12:20:19.797 に答える
-1

カプセル化は抽象化の一例です。カプセル化の全体的なポイントは、関数内で何が起こっているかを抽象化し、その複雑さをすべてシンボル (関数の参照または名前) に減らし、関数をブラック ボックスに変えることです。

プログラミングでは、「抽象」という言葉はコマンドです。クラスが抽象クラス (またはインターフェース) を継承すると、抽象化を作成するように命じられます。

于 2015-11-27T09:12:47.167 に答える