複数のインターフェース
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 から継承し、両方のインターフェースを実装する
}この柔軟性により、複数のソースから動作を組み合わせられます。RobotはIMovable、IChargeable、ISpeakableを実装できます。各インターフェースは単一の機能を表し、クラスでは必要なものだけを自由に組み合わせられます。
チャレンジ
簡単単一の class が複数の interfaces を Implement して異なる機能を得る方法を示す、スマートホームデバイス system を構築しましょう。controllable であり、power management 機能も備えたデバイスを Create します。
コードを4つのファイルに分けて整理します。
IControllable.cs:SmartHomenamespace にIControllableという interface を Define します。この interface は、電源をオン・オフできるデバイスを表します。2つの methods、TurnOn()とTurnOff()を declare し、どちらも string を返すようにします。INetworkConnected.cs:SmartHomenamespace にINetworkConnectedという interface を Define します。この interface は、ネットワークに接続できるデバイスを表します。string を返すConnect(string network)method を declare します。SmartTV.cs:SmartHomenamespace に、IControllableとINetworkConnectedの both を implements するSmartTVclass を Define します。TV にはBrandproperty(string)とScreenSizeproperty(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 なSmartTVtype、IControllablevariable、INetworkConnectedvariable に格納して、複数の 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 が Samsung、55、HomeWiFi の場合、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)を呼び出す
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
5ポリモーフィズムとインターフェース
コンパイル時 vs 実行時ポリモーフィズムインターフェース vs 抽象クラス複数のインターフェース明示的なインターフェースアップキャストとダウンキャストまとめ - 図形計算機自分で練習してみよう: C#オンラインコンパイラ