Menu
Coddy logo textTech

複数のインターフェース

CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 27/70。

class は1つの base class からしか継承できませんが、必要な数の interfaces を実装できます。これは、interfaces が抽象クラスに対して持つ主な利点の1つです。interfaces によって、class は複数の振る舞いを採用できます。

複数のインターフェースを実装するには、コロンの後にカンマで区切って列挙するだけです。

public interface IFlyable
{
    void Fly();
}

public interface ISwimmable
{
    void Swim();
}

public class Duck : IFlyable, ISwimmable
{
    public void Fly()
    {
        Console.WriteLine("Flying through the air");
    }
    
    public void Swim()
    {
        Console.WriteLine("Swimming in the pond");
    }
}

Duck クラスは、両方のインターフェースのすべてのメンバーを実装する必要があります。これは現実世界のシナリオを自然にモデル化します。つまり、アヒルは実際に飛ぶことも泳ぐこともできるため、両方の契約を満たすのが理にかなっています。

継承と複数のインターフェースを組み合わせる場合、基底クラスを最初に記述する必要があります。

public class Duck : Bird, IFlyable, ISwimmable
{
    // Bird から継承し、両方のインターフェースを実装する
}

この柔軟性により、複数のソースから動作を組み合わせられます。RobotIMovableIChargeableISpeakableを実装できます。各インターフェースは単一の機能を表し、クラスでは必要なものだけを自由に組み合わせられます。

challenge icon

チャレンジ

簡単

単一の class が複数の interfaces を Implement して異なる機能を得る方法を示す、スマートホームデバイス system を構築しましょう。controllable であり、power management 機能も備えたデバイスを Create します。

コードを4つのファイルに分けて整理します。

  • IControllable.csSmartHome namespace に IControllable という interface を Define します。この interface は、電源をオン・オフできるデバイスを表します。2つの methods、TurnOn()TurnOff() を declare し、どちらも string を返すようにします。
  • INetworkConnected.csSmartHome namespace に INetworkConnected という interface を Define します。この interface は、ネットワークに接続できるデバイスを表します。string を返す Connect(string network) method を declare します。
  • SmartTV.csSmartHome namespace に、IControllableINetworkConnected の both を implements する SmartTV class を Define します。TV には Brand property(string)と ScreenSize property(int、inch を表す)を持たせます。both の値を受け取る Constructor を Create します。すべての interface methods を Implement します。
    • TurnOn()"{Brand} {ScreenSize}-inch TV is now ON" を返します
    • TurnOff()"{Brand} {ScreenSize}-inch TV is now OFF" を返します
    • Connect(string network)"{Brand} TV connected to {network}" を返します
  • Program.cs:Main file で、input values を使用して SmartTV を Create します。同じ TV object を3つの different な variable types、つまり concrete な SmartTV type、IControllable variable、INetworkConnected variable に格納して、複数の interfaces の柔軟性を示します。それぞれの reference を通じて適切な methods を Call し、作業対象の interface に応じて同じ object を different に扱えることを示します。

3つの input を受け取ります。

  • TV の brand 名
  • inch 単位の Screen size
  • 接続先の Network name

次の format で output を Print します。

Via SmartTV:
{TurnOn() result}
{Connect(network) result}
Via IControllable:
{TurnOff() result}
Via INetworkConnected:
{Connect(network) result}

たとえば、input が Samsung55HomeWiFi の場合、output は次のようになります。

Via SmartTV:
Samsung 55-inch TV is now ON
Samsung TV connected to HomeWiFi
Via IControllable:
Samsung 55-inch TV is now OFF
Via INetworkConnected:
Samsung TV connected to HomeWiFi

同じ SmartTV object に different な interface references を通じてアクセスできることに注目してください。IControllable として格納した場合、control methods だけを Call できます。INetworkConnected として格納した場合、network methods だけを Call できます。これが複数の interfaces を Implement する power です。1つの class が複数の capabilities を得ながら、その使い方については柔軟性を保てます。

自分で試してみよう

using System;
using SmartHome;

class Program
{
    public static void Main(string[] args)
    {
        // 入力を読み取る
        string brand = Console.ReadLine();
        int screenSize = Convert.ToInt32(Console.ReadLine());
        string network = Console.ReadLine();
        
        // TODO: 入力値でSmartTVオブジェクトを作成する
        
        // TODO: 同じTVオブジェクトを3つの異なる変数型に格納する:
        // 1. SmartTV型(具象クラス)
        // 2. IControllable type (interface reference)
        // 3. INetworkConnected type (interface reference)
        
        // TODO: 指定された形式で出力を表示する:
        // Via SmartTV:
        // - TurnOn()とConnect(network)を呼び出す
        // Via IControllable:
        // - TurnOff()を呼び出す
        // Via INetworkConnected:
        // - Connect(network)を呼び出す
        
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: C#オンラインコンパイラ