-1

重複の可能性:
インターフェース: 把握できないのはなぜですか?

ライブラリを操作するには、最初にいくつかのインターフェイスを実装する必要があることがわかりました。しかし、いくつかのメソッドは、いくつかのインターフェイスのタイプを持つオブジェクトを要求しているようです...そして、 MyInterface というインターフェイスがあれば、次のように書くことができます:

    MyInterface shoe;

それは私には本当に意味がありません。誰かが私にこの概念を教えてもらえますか? http://www.dotnetperls.com/interfaceを読みましたが、実際には役に立ちませんでした。この概念は、ここで提示されているものよりも少し複雑だと思います。

ありがとう !

編集 :

疑問に思っている人のために、私はインターフェースに慣れていませんが、そのような使用法に遭遇したのは初めてです. そして、私の質問を格下げした人のために、私は検索を行いましたが、明らかに不運でした.

4

6 に答える 6

4

簡単に説明すると、クラスは会社のようなものです。販売会社であると主張する場合、販売サービスを提供する必要があります。鉄道工場であると主張するなら、列車を作ることができなければなりません。国鉄が列車を購入したい場合は、列車を製造できる会社ならどこでも利用できます。

インターフェイスは、クラスが実行できる必要があることを記述します。契約のようなものです。インターフェースを持ちたいと思う各クラスは、その契約を履行し、契約に書かれていることを実行できなければなりません。クラス インスタンスは、クラス メソッドを通じてアクションを実行できます。

ただし、契約には、クラスがどのように行うべきかは記載されていません。したがって、クラスは必要に応じて機能を実装できます。つまり、インターフェイスを実装できます

public Train
{
    private price;
    public Train(float price) { this.price = price; }
}

public IMyInterface
{
   Train MakeTrain();
}

public ExpensiveTrainFactory : ITrainProducer
{
    // make a luxury, expensive train
    public Train MakeTrain() { return new Train(4000.0); }
}

public CheapTrainFactory : ITrainProducer
{
    // make a cheap train
    public Train MakeTrain() { return new Train(500.0); }
}

public NationalRailways
{
    List<Train> trains;
    public NationalRailways()
    {
        this.trains = new List<Train>();
    }
    public Train BuyTrain(ITrainProducer factory)
    {
        // you can call MakeTrain() because the ITrainProducer guarantees that it can make trains
        trains.Add(factory.MakeTrain());
    }
}

そして、あなたのコードで:

NationalRailways railway = new NationalRailways();
ExpensiveTrainFactory expFactory = new ExpensiveTrainFactory();
CheapTrainFactory cheapFactory = new CheapTrainFactory();

// expFactory implements ITrainProducer, so I can use it from BuyTrain(ITrainProducer)
railways.BuyTrain(expFactory);
// cheapFactory implements ITrainProducer, so I can use it from BuyTrain(ITrainProducer)  as well
railways.BuyTrain(cheapFactory);
于 2012-08-03T10:00:14.360 に答える
3

例のように、インターフェイスを宣言できます。ただし、インスタンス化することはできません。

MyInterface shoe = new MyInterface ();

上記は法的なコードではありません。インターフェイスはコントラクトを記述するだけなので、実装の詳細はありません。これはクライアント コード (あなた) に任されています。したがって、MyInterface の実際のインスタンスを作成できることは意味がありません。

できることは、クラス SomeClass を持ち、MyInterface コントラクトを実装することです。

SomeClass: MyInterface
{
  //implement the methods of MyInterface. All of them, to fulfill the contract.
}

次に、次のようなことができます。

MyInterface shoe = new SomeClass();

SomeClass は MyInterface コントラクトを実装しているため、上記は有効です。実装の詳細が含まれているため、 SomeClass のインスタンスを作成できます。

次に、これに基づいて構築し、MyInterface を実装するクラスをさらに作成できます。

これの利点は、たとえば次のようなメソッドを使用できることです。

void someMethod (MyInterface test)
{

}

このメソッドには、MyInterface を実装する SomeClass オブジェクトまたは作成したその他のクラスを渡すことができます。

次に、このメソッド内で、渡された正確なオブジェクトを知らなくても、コントラクトに含まれるメソッドを呼び出すことができます。これにより、将来のコードの記述が容易になります。新しいオブジェクトを作成できます。それらが MyInterface を実装している限り、メソッドの宣言を変更せずにこのオブジェクトを someMethod に渡すことは有効です。

于 2012-08-03T10:03:51.883 に答える
2

その通りです。インターフェイスのインスタンスを直接作成することはできません。ただし、そのインターフェイスを実装するタイプのインスタンスを作成することはできます。

インターフェースがあるとしましょう

public IMyInterface
{
   void DoSomething();
}

(注: 通常、インターフェースの名前は「I」で始めます)

さらに、クラスがあります

public MyClass: IMyInterface
{
    public void DoSomething() { ... }
}

それから私はすることができます

IMyInterface something = new MyClass();

を直接実行する代わりに、そのインターフェイスを実装するクラスを返すために、いくつかの(ファクトリ)メソッドを呼び出すことがよくありますnew

インターフェイスを変数の型として使用することにより、そこで指定されたメソッドとプロパティのみに関心があることを指定します。

于 2012-08-03T09:57:13.860 に答える
2

C# では、各値には、見かけの型と実際の型の2 つの異なる型があります。見かけの型は値を保持する変数の型であり、実際の型は値の作成に使用されるコンストラクターから取得されます。次のクラスがあるとします。

class MyClass : BaseClass, IMyInterface {
    /* ... */
}

次に、次のすべての宣言が有効です。

object obj1 = new MyClass();
IMyInterface obj2 = new MyClass();
BaseClass obj3 = new MyClass();
MyClass obj4 = new MyClass();

見かけのタイプと実際のタイプは次のとおりです。

object obj1 = new MyClass(); /* apparent: object, actual: MyClass */
IMyInterface obj2 = new MyClass(); /* apparent: IMyInterface, actual: MyClass */
BaseClass obj3 = new MyClass(); /* apparent: BaseClass, actual: MyClass */
MyClass obj4 = new MyClass(); /* apparent: MyClass, actual: MyClass */

オブジェクトを操作する (そのメソッドを呼び出すなど) ときは、オブジェクトが見かけの型を持っていると仮定して行います - のクラス固有のメソッドは呼び出せませんobject。見かけの型は、オブジェクトの外側に見えるオブジェクトのインターフェースを決定します。

内部で実際に行われることは、オブジェクトの実際の型に従って行われます。たとえば、ToStringクラスのメソッドをオーバーライドすると、オーバーライドされたメソッドが次のコードで呼び出されます。

object obj = new MyClass();
Console.WriteLine(obj.ToString());

実際の型によって、オブジェクトの機能がどのように実装されるかが決まります。

于 2012-08-03T10:07:13.673 に答える
1

インターフェイスは、クラスとそれを呼び出すコードとの間の契約を確立します。また、同じインターフェースを実装しているが異なるアクションまたはイベントを実行する類似のクラスを持つこともでき、実際にどちらを操作しているかを知る必要はありません。これは例としてより理にかなっているかもしれないので、リンクと同じ例を少し変更して使用しましょう。

using System;

interface IPerl
{
    void Read();
}

class Test : IPerl
{
    public void Read()
    {
    Console.WriteLine("Read Test");
    }
}

class Test1 : IPerl
{
    public void Read()
    {
    Console.WriteLine("Read Test1");
    }
}

class Program
{
    static void Main()
    {
    IPerl perl = new Test(); // Create instance of Test.
    perl.Read(); // Call method on interface output will be different then Test1.

        perl = new Test1(); // Create instance of Test1.
    perl.Read(); // Call method on interface output will be different then Test.

    }
}

出力:

  1. 「テストを読む」
  2. 「テスト1を読む」

これが役立つことを願っています。

ありがとうアンクル

于 2012-08-03T10:02:12.790 に答える
0

インターフェイスとは

インターフェイスは基本的に、クラスまたは構造体の青写真を定義します。インターフェイスのプログラムされた定義は、クラスと非常によく似ていますが、何も実装されていません。インターフェイスは、プロパティ、メソッド、イベント、およびインデクサーを定義しますが、インターフェイスはこれらの実装を定義しません。存在を宣言しているだけです。インターフェイスは、実際には機能を定義しません。それらは、クラスとの相互作用が行われる方法を定義するだけです。

ないインターフェース

インターフェイスを継承と混同しないでください。それらは2つの非常に異なるものです。継承は多くの実装を定義し、コードの再利用に使用されます。インターフェイスは、実装するクラスとの通信方法を定義するだけです。書面による契約のようなものです。コントラクトに「署名」するクラスは、特定の指定されたアクションを任意の方法で実行することに同意しますが、指定されたアクションを実行する必要があります。

インターフェイスを使用する場合

インターフェイスを使用すると、クラスが実装しようとしているものに適したレイアウトを作成できます。インターフェイスが保証するため、多くのコンポーネントが同じインターフェイスを使用している場合、あるコンポーネントを同じインターフェイスを使用する別のコンポーネントと簡単に交換できます。これから動的なプログラムが簡単に形成され始めます。

詳細については、Understanding_Interfaces_in_C#に関するこの投稿を参照してください。

于 2012-08-03T09:58:12.560 に答える