インターフェース — 何がポイントですか? 質問する

インターフェース — 何がポイントですか? 質問する

インターフェースの理由がまったくわかりません。私が理解しているところによると、これは C# には存在しない多重継承を回避するための一種の方法だそうです (少なくとも私はそう聞きました)。

私が思うに、いくつかのメンバーと関数を事前に定義し、それをクラス内で再度定義する必要があるだけです。そのため、インターフェイスが冗長になります。構文的に... まあ、私にはジャンクのように感じます (気を悪くしないでください。ジャンクとは、役に立たないものという意味です)。

スタック オーバーフローの別の C# インターフェイス スレッドから抜粋した以下の例では、インターフェイスの代わりに Pizza という基本クラスを作成します。

簡単な例(別のスタックオーバーフロー投稿から抜粋)

public interface IPizza
{
    public void Order();
}

public class PepperoniPizza : IPizza
{
    public void Order()
    {
        //Order Pepperoni pizza
    }
}

public class HawaiiPizza : IPizza
{
    public void Order()
    {
        //Order HawaiiPizza
    }
}

ベストアンサー1

インターフェースがどのように役立つかをわかりやすく説明した人は誰もいないので、試してみようと思います (Shamim の回答から少しアイデアを盗みます)。

ピザ注文サービスを考えてみましょう。複数の種類のピザを用意でき、各ピザの共通アクションはシステムで注文を準備することです。各ピザを準備する必要がありますが、ピザごとに準備方法が異なります。たとえば、詰め物をしたクラスト ピザが注文されると、システムはレストランで特定の材料が入手可能かどうかを確認し、ディープ ディッシュ ピザに必要のない材料を取っておく必要があります。

これをコードで書く場合、技術的には次のようにすればよい。

public class Pizza
{
    public void Prepare(PizzaType tp)
    {
        switch (tp)
        {
            case PizzaType.StuffedCrust:
                // prepare stuffed crust ingredients in system
                break;
                
            case PizzaType.DeepDish:
                // prepare deep dish ingredients in system
                break;
                
            //.... etc.
        }
    }
}

ただし、ディープ ディッシュ ピザ (C# 用語) では、Prepare()詰め物をしたクラストとは異なるプロパティをメソッドに設定する必要があり、その結果、多くのオプション プロパティが必要になるため、クラスは適切に拡張されません (新しいピザ タイプを追加した場合はどうなりますか)。

これを解決する適切な方法は、インターフェースを使用することです。インターフェースは、すべてのピザを準備できることを宣言しますが、ピザごとに異なる方法で準備できます。したがって、次のインターフェースがあるとします。

public interface IPizza
{
    void Prepare();
}

public class StuffedCrustPizza : IPizza
{
    public void Prepare()
    {
        // Set settings in system for stuffed crust preparations
    }
}

public class DeepDishPizza : IPizza
{
    public void Prepare()
    {
        // Set settings in system for deep dish preparations
    }
}

これで、注文処理コードでは、材料を処理するために注文されたピザの種類を正確に知る必要がなくなりました。必要なのは、次の情報だけです。

public PreparePizzas(IList<IPizza> pizzas)
{
    foreach (IPizza pizza in pizzas)
        pizza.Prepare();
}

ピザの種類ごとに準備方法は異なりますが、コードのこの部分では、扱っているピザの種類を気にする必要はなく、ピザに対して呼び出されていることだけを認識します。そのため、コレクションにPrepare複数の種類のピザがある場合でも、各呼び出しで、その種類に基づいて各ピザが自動的に正しく準備されます。

おすすめ記事