はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】インターフェイスメンバーの明示的な実装

はじめに

今回はインターフェイスのメンバーを明示的に実装する方法についての記事になります!

普通にインターフェイスを実装した場合と違い、いつくか変わった動作をします。

普通の実装と明示的な実装の異なるところ

最初に結論を言ってしまいたいと思います。

・ひとつのクラスに複数のインターフェイスを実装していて、同じ引数・戻り値・名前がどちらのインターフェイスにも定義されている場合にもそれぞれに対応することができるところ

・インターフェイスで定義されたメンバはpublicではなくprivateのように振る舞うところ

この二つです。それぞれを細かくみていきましょう。

複数のインターフェイス

例えばこのようなスクリプトを考えてみましょう。

using UnityEngine;

public class Hoge : MonoBehaviour
{
    private void Start()
    {
        ISample1 sample1 = new SampleClass();
        ISample2 sample2 = new SampleClass();

        sample1.SomeMethod();
        sample2.SomeMethod();
    }
}

public class SampleClass : ISample1, ISample2
{
    public void SomeMethod()
    {
        Debug.Log("SomeMethod");
    }
}

public interface ISample1
{
    void SomeMethod();
}

public interface ISample2
{
    void SomeMethod();
}

f:id:hanaaaaaachiru:20190501201604p:plain

この場合はどちらのインターフェイスに対しても同じメソッドで実装をしています
これを明示的にすることでこのように変えることが可能になります。

using UnityEngine;

public class Hoge : MonoBehaviour
{
    private void Start()
    {
        ISample1 sample1 = new SampleClass();
        ISample2 sample2 = new SampleClass();

        sample1.SomeMethod();
        sample2.SomeMethod();
    }
}

public class SampleClass : ISample1, ISample2
{
    void ISample1.SomeMethod()
    {
        Debug.Log("SomeMethod1");
    }

    void ISample2.SomeMethod()
    {
        Debug.Log("SomeMethod2");
    }
}

public interface ISample1
{
    void SomeMethod();
}

public interface ISample2
{
    void SomeMethod();
}

f:id:hanaaaaaachiru:20190501201719p:plain

このように複数のインターフェイスに対して異なる定義をすることが可能になります

privateのように振る舞う

先程のスクリプトの中で、下のように変更をしようとするとエラーがでてきます。

public void ISample1.SomeMethod()

このようにメソッドをpublicにすることができません
特に普通のインターフェイスではpublicにしなければならないのと比べて対照的ですね。

これをすることで必ずインターフェイス型の参照変数を通してアクセスさせることが可能になります。

つまりは、

SampleClass sample = new SampleClass();
sample.SomeMethod()

このようにアクセスすることができなくなります。

さいごに

C#ではポリモーフィズムという考え方が重要になっています。
その考え方においてインターフェイスのこういった動きはとても大切なので、覚えておいて損はないでしょう!

参考