【C#】インターフェイス

インターフェイス(Interface)

単語自体は接触面・境界面という意味。
プログラミングではクラスとの境界面のイメージ

インターフェイスの実装

public interface IPublicClz1
{
  public void Display();
}

public class PublicSingleClz : IPublicClz1
{
  public void Display() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);
}

インターフェイスの多重継承

C#ではクラスは単一継承であったが、インターフェイスは多重継承可能。
public interface IPublicClz1
{
  public void Display();
}

public interface IPublicClz2
{
  public void Display2();
}


public class PublicSingleClz : IPublicClz1, IPublicClz2
{
  public void Display() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);
  public void Display2() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);
}

明示的実装

インターフェイス名.メソッド名で明示的実装が可能。
public interface IPublicClz1
{
  public void Display();
}

public interface IPublicClz2
{
  //public void Display2();
  public void Display();
}


public class PublicSingleClz : IPublicClz1, IPublicClz2
{
  //public void Display() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);
  void IPublicClz1.Display() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);
  //public void Display2() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);
  void IPublicClz2.Display() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);
}
明示的実装したメソッドはinterfaceにキャストする必要がある。
var publicMultiClz = new PublicMultiClz();
//publicMultiClz.Display();
var iPublicClz1 = publicMultiClz as IPublicClz1;
iPublicClz1.Display();
var iPublicClz2 = publicMultiClz as IPublicClz2;
iPublicClz2.Display();

アクセス修飾子

publicでないメソッドは明示的実装が必要。
internal interface IInternalClz
{
  internal void Display1();
  public void Display2();
}


internal class InternalClz : IInternalClz
{
  //internal void Display1() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);
  void IInternalClz.Display1() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);

  public void Display2() => Console.WriteLine(this.GetType() + "." + MethodBase.GetCurrentMethod().Name);
}