1

インターフェイスは情報を隠すためにも使用され、ユーザーが使用できるメソッドのサブセットのみをユーザーに提供します。たとえば、PersonクラスとインターフェイスがありますIPerson

今メインで、私はすることが許可されています

IPerson testy = new Person();

また

Person testy = new Person();

だから本当に私はまだPersonを使うことに制限されていません。では、インターフェースはどのようにして本当にデータを隠すのでしょうか?

4

4 に答える 4

5

インターフェイスは、それ自体が何かを「隠す」ために使用されることはありません。これは、呼び出し元と実装の間のコントラクトを確立するために使用されます。この契約は、「これらのメソッドとプロパティはここにあり、変更されない」ことを約束します。

インターフェースはまた、呼び出し元がそれに対処する必要なしに、実装を変えるという素晴らしい可能性を開きます。これは、分離された設計では不可欠です。

あなたの質問は、あなたがクラスについてすべてを知りmain たいことを意味します。Person実際に得られるのは結合コードであり、テストが困難です。これを「修正」するには、考え方を変えて考える必要があります。すべてを知りmainたくない、それはインターフェースPersonだけに興味があり、必要なだけです。IPersonこれ以上でもそれ以下でもありません。

于 2011-01-11T08:21:19.427 に答える
4

あなたの誤解は、「情報を隠す」という意味から来ています。これを聞いた人は誰でも、インターフェースを実装することで、クラスがその前向きメソッドを内部実装から分離できるようになるということを意味していました。

これは「カプセル化」とも呼ばれ、その利点は、デザイナーがオブジェクトのパブリックインターフェイスの周りに記述された既存のコードを中断することなく、オブジェクトの内部メカニズムを変更できるようにすることです。したがって、「コントラクト」と呼ばれるインターフェースをよく耳にします。これは、クラスのユーザーと実装者の間で、前向きのメソッドが一貫性​​を保つという暗黙の合意を作成するためです。また、複数のクラスが単一のインターフェイスを実装できるため、同じパブリックインターフェイスを実装している限り、1つのコンポーネントを別のコンポーネントに簡単に置き換えることができます。オブジェクト指向デザインに関する著名な本の著者であるGradyBoochは、カプセル化を次のように定義しています。

その構造と振る舞いを構成する抽象化の要素を区分化するプロセス。カプセル化は、抽象化とその実装の契約上のインターフェースを分離するのに役立ちます。

オブジェクトのコンシューマーは、そのオブジェクトの設計者がその機能を内部でどのように実装したかを知っている必要はありません。電子レンジについて考えてみてください。電子レンジを使ってスナックを作るために必要なのは、前面にあるいくつかのボタンを押すことだけです。それがあなたの電子レンジのパブリックインターフェースです。ポップコーンの袋を作るためだけに、そのデザインの背後にある科学的原理を理解する必要はありません。ここでのインターフェースの利点は、複雑さが軽減され、他の開発者がクラスを簡単に利用できるようになることです。

したがって、質問で与えられた例に戻って参照すると、Personクラスの使用が制限されることは想定されていませんが、アクセスできるそのクラスによって公開されるメソッドが制限される可能性があります。たとえば、クラスは個人の名前を個別のフィールドにPerson内部的に格納しますが、これらのプライベート名フィールドの両方の連結を返す1つのプロパティのみを公開します。FirstNameLastNameName

しかし、オブジェクト指向の設計と用語はかなり複雑です。概念についての良い本を探して、それを注意深く読むことを強くお勧めします。そのおかげであなたはより良いプログラマーになるでしょう。

于 2011-01-11T08:22:35.010 に答える
3

Personそのクラスがない場合はどうなりますか。

 Object obj = loadObject();

 if(obj is IPerson) {

  IPerson person = (IPerson) obj;

 } 

また

  IPerson person = loadPerson();
于 2011-01-11T08:19:36.057 に答える
0

.netのインターフェースの基本的な目的は、限定された形式の多重継承を提供することです。クラスに別のクラスから継承させることは、2つの直交する目的を果たします。

  1. これは、派生クラスのニーズを適切に満たす基本クラスのフィールド、メソッド、およびプロパティを、再指定することなく派生クラスで使用できることを意味します。
  2. これは、基本クラスのメソッドを期待するコードが、派生クラスのメソッドを自動的に処理できることを意味します。

.netのクラスが、基本クラス以上のメンバーを暗黙的に使用することはできませんが、クラスが多くのインターフェースを実装し、それらのいずれかを置き換えることは可能です。たとえば、辞書とリンクリストにはあまり共通点はありませんが、両方を列挙することができます。シリアルポートとリストボックスにはあまり共通点はありませんが、どちらも破棄できます。

インターフェイスで実行できるほとんどすべてのことは、抽象基本クラスでも同様に、またはそれ以上に実行できます。基本クラスでは不可能な、インターフェイスで実行できる1つのことは、限定された形式の多重継承を許可することです。

于 2011-01-18T16:39:52.573 に答える