やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#8.0インタフェース新機能を試してみる4(mixin)

 多重継承したり、インタフェースがインタフェースを継承したり。

成果物

情報源

 なんか日本語でなく英語だった。自動翻訳でも大きな問題なし。ただ、少し複雑だった。読んでみると要点は以下のようだった。

  • インタフェースがインタフェースを継承する
  • インタフェースを多重継承してクラス実装する
  • インスタンスが指定インタフェースを継承しているか判定する

 そこで、ポイントをおさえて単純化した例を自分で作ることにした。

題材

 例として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();
    }
}
  • 指定インタフェースを継承している場合のみ、そのメソッドを実行する

 もし共通しない固有の機能を使いたいときは、上記のように分岐させる。

所感

 何も実装していないため、何も表示されない。動作確認できないけど、要点つかめたからいいや。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux