多重継承したり、インタフェースがインタフェースを継承したり。
成果物
情報源
なんか日本語でなく英語だった。自動翻訳でも大きな問題なし。ただ、少し複雑だった。読んでみると要点は以下のようだった。
- インタフェースがインタフェースを継承する
- インタフェースを多重継承してクラス実装する
- インスタンスが指定インタフェースを継承しているか判定する
そこで、ポイントをおさえて単純化した例を自分で作ることにした。
題材
例としてPC入力装置マウスを用いる。マウスにはシンプルなものから多機能なものまである。これらの機能をインタフェースで定義する。そしてインタフェースを継承して新しいインタフェースに拡張したり、インタフェースを多重継承してクラスを実装したりしてみる。
プロジェクト作成
dotnet new console -o CS8_Interface cd CS8_Interface
コード
インタフェースは以下。
public interface IMouse { public void Move(); public void ClickLeft(); public void ClickRight(); } public interface IWheelButtonMouse : IMouse { public void ClickCenter(); } public interface IWheelMouse : IMouse { public void ScrollUp(); public void ScrollDown(); } public interface ITiltWheelMouse : IMouse { public void TiltLeft(); public void TiltRight(); } public interface IExtendButtonMouse : IMouse { public void PushButton1(); public void PushButton2(); }
- インタフェースが他のインタフェースを継承している
クラスは以下3つ。現実にあるマウスは大体この3タイプに分類される気がする。実際はもっと沢山ある。もっとボタンが多いものもある。ポインタの方式も複数ある(ボール、光学、赤外線、ブルーライト、レーザー)。有線/無線の違いもある。ただし今回これらは除外する。
public class SimpleMouse : IMouse {} public class PopularMouse : IWheelMouse {} public class MultifunctionalMouse : IWheelMouse, IWheelButtonMouse, ITiltWheelMouse, IExtendButtonMouse {}
メソッド実装させると以下。
public class SimpleMouse : IMouse { public void Move() {} public void ClickLeft() {} public void ClickRight() {} } public class PopularMouse : IWheelMouse { public void Move() {} public void ClickLeft() {} public void ClickRight() {} public void ScrollUp() {} public void ScrollDown() {} } public class MultifunctionalMouse : IWheelMouse, IWheelButtonMouse, ITiltWheelMouse, IExtendButtonMouse { public void Move() {} public void ClickLeft() {} public void ClickRight() {} public void ClickCenter() {} public void ScrollUp() {} public void ScrollDown() {} public void TiltLeft() {} public void TiltRight() {} public void PushButton1() {} public void PushButton2() {} }
MultifunctionalMouse
が多重継承している
呼出元は以下。
using System; using System.Collections.Generic; // マウス生成 List<IMouse> mouses = new List<IMouse> { new SimpleMouse(), new PopularMouse(), new MultifunctionalMouse(), }; // メソッド呼出 foreach(IMouse mouse in mouses) { mouse.Move(); mouse.ClickLeft(); mouse.ClickRight(); if (mouse is IWheelButtonMouse wheelButtonMouse) { wheelButtonMouse.ClickCenter(); } if (mouse is IWheelMouse wheelMouse) { wheelMouse.ScrollUp(); wheelMouse.ScrollDown(); } if (mouse is ITiltWheelMouse tiltWheelMouse) { tiltWheelMouse.TiltLeft(); tiltWheelMouse.TiltRight(); } if (mouse is IExtendButtonMouse extendButtonMouse) { extendButtonMouse.PushButton1(); extendButtonMouse.PushButton2(); } }
- 指定インタフェースを継承している場合のみ、そのメソッドを実行する
もし共通しない固有の機能を使いたいときは、上記のように分岐させる。
所感
何も実装していないため、何も表示されない。動作確認できないけど、要点つかめたからいいや。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- SQLite 3.29.0 ※
- C# dotnet 3.0.100
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux