66

クラスから Interface インスタンスが生成されるのを何度も見てきました。なぜこのようにインターフェイスを使用するのですか? インターフェイス インスタンスは、派生クラスの助けを借りてそれ自体のみが作成され、このインスタンスを介してこれらのインターフェイス メンバーにのみアクセスできます。これはどのように利点をもたらしますか?私は困惑している。

interface IPrint
{
    void Print();
}

class Sample : IPrint
{
    public void Print()
    {
        Console.WriteLine("Print...");
    }

    public void Sample()
    {
        Console.WriteLine("Sample...");
    }
}

class Program
{
    static void Main(string[] args)
    {
        IPrint print = new Sample();
        print.Print();
    }
}
4

4 に答える 4

107

インターフェイスは、クラスが何かを実行できなければならないことを定義します。これは、作業中のオブジェクトが、実行したいことを実行することを知っていることを意味します。これにより自由度が増し、OOP の利点の 1 つになります。これは深いトピックですが、非常に基本的な例は次のとおりです。

public interface IAnimal
{
    string Speak();
}

public class Dog : IAnimal
{
    public string Speak()
    {
        return "Woof, woof";
    }
} 

public class Cat : IAnimal
{
    public string Speak()
    {
        return "Meow";
    }
} 

public class Parrot : IAnimal
{
    public string Speak()
    {
        return "Sqwark!";
    }
} 

次に、好きな動物を使用できます。

class Program
{
    static void Main(string[] args)
    {
        // Writes Woof, Woof
        IAnimal animal = new Dog();
        Console.WriteLine(animal.Speak());        

        // Now writes Meow
        animal = new Cat();
        Console.WriteLine(animal.Speak());

        // Now writes Sqwark etc
        animal = new Parrot();
        Console.WriteLine(animal.Speak());
    }
}

これにより、次のようにアイテムを取り込んで、犬、猫、またはオウムを渡すことができるInversion Of Control のようなものに入ることができます。この方法は、それがどの動物であるかを知らず、気にしなくても常に機能します。

public void ShoutLoud(IAnimal animal)
{
    MessageBox.Show("Shout " + animal.Speak());
}

これにより、実際の動物ではなくモック オブジェクトを使用できるため、ShoutLoudユニットがテスト可能になります。基本的に、コードを厳格で密結合するのではなく、柔軟で動的にします。

また、マシューの質問を拡張します。C# では、1 つの基本クラスからしか継承できませんが、複数のインターフェイスを持つことができます。したがって、次のようにすることができます。

public class Dog : IAnimal, IMammal, ICarnivor

これにより、小さなインターフェース (推奨) を持つことができ、それを構築して、アイテムができること/しなければならないことを最大限に制御できます。

于 2013-05-30T09:34:07.247 に答える
10

このようにインターフェイスを使用すると、インターフェイスの標準テンプレートを使用するメソッドを作成できます。したがって、ここには、すべてが継承するプリンターのクラスが多数ある可能性がありますIPrinter

class SamsungPrinter : IPrinter
{
    // Stuff and interface members.
}

class SonyPrinter : IPrinter
{
    // Stuff and interface members.
}

interface IPrinter
{
    void Print();
}

したがって、各タイプSamsungPrinterSonyPrinterなどについて、次のようなものを使用して前処理できます

public static void PreProcessAndPrint(IPrinter printer)
{
    // Do pre-processing or something.
    printer.Print();
}

IPrinterメソッド パラメーターでその型を継承して使用することで、Print渡されたオブジェクトに対していつでも安全にメソッドを使用できることがわかります。

もちろん、インターフェースの使用には他にも多くの用途があります。それらの使用の一例は、設計パターン、特に Factory および Strategy パターンです。その説明と例はここにあります。

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

于 2013-05-30T09:31:22.410 に答える