ヘッダー
C# サンプル集
 

インターフェースの宣言

2021/4/18

→ Visual Basic のサンプルに切り替える

 

一般的なインターフェース

public interface ISample
{
    string Name { get; set; }

    void DoSomething(string value);

    int Add(int x, int y);
}

実装例

public class ConcreteSample : ISample
{
    public string Name { get; set; }
    public void DoSomething(string value)
    {
        value = value.ToUpper();
    }

    public int Add(int x, int y)
    {
        return x + y;
    } 
}

 

複数のインターフェースを実装するとメンバーの定義が重複してしまう場合があります。その場合、上記の実装例では同じ実装が使用されることになります。実装を区別したい場合は、下記のような明示的な実装を使用します。

public interface IComputer
{
    string GetName();
}

public interface IUser
{
    string GetName();
}

public class SystemOperator : IComputer, IUser
{
    string IComputer.GetName()
    {
        return Environment.MachineName;
    }

    string IUser.GetName()
    {
        return Environment.UserName;
    }
}

インターフェースの明示的な実装はインスタンスから直接呼び出せず、インターフェースを明示して呼び出す必要があります。

SystemOperator op = new SystemOperator();
//string name0 = op.GetName(); //←これはできない
string name1 = (op as IComputer).GetName(); 
string name2 = (op as IUser).GetName();

 

 

型パラメーターを持つインターフェース(ジェネリック)

public interface ISample<T>
{
    T Value {get; set;}

    void Skip();
}

実装例

public class ConcreteSample : ISample<DateTime>
{
    public DateTime Value {get; set;}

    public void Skip()
    {
        Value = Value.AddDays(1);
    }
}

型パラメーターを解決しないで実装することもできます。

public class ConcreteSample<T> : ISample<T>
{
    public T Value {get; set;}

    public void Skip()
    {
        //Do Something
    }
}

 

 

インターフェースを継承するインターフェース

public interface IHuman : ISpeaker, IWalker
{
    void Think();
}

public interface ISpeaker
{    
    void Speak();
}

public interface IWalker
{
    void Walk();
}

実装例

public class Human : IHuman
{
    public void Speak()
    {
        //Do Something
    }

    public void Walk()
    {
        //Do Something
    }

    public void Think()
    {
        //Do Something
    }
}

メモ:実装時に複数のインターフェースを カンマで区切って指定することもできます。

 

 

既定の実装を含むインターフェース

C# 8.0(2019年9月)以降は、インターフェースに既定の実装を含められます。

public interface IComputer
{
    string GetName()
    {
        return "MachineName";
    }
}

public class Operator : IComputer
{    
    // 空
}

インターフェースの既定の実装はインスタンスから直接呼び出せず、インターフェースを明示して呼び出す必要があります。

Operator op = new Operator();
//string name0 = op.GetName(); //←これはできない
string name1 = (op as IComputer).GetName();  // MachineName

メモ:C#に十分詳しくない場合は、この機能を使用しないことをお勧めします。代わりに拡張メソッドでインターフェースで拡張することも検討してください。

 

 

参考

インターフェイス - C# プログラミング ガイド | Microsoft Docs

明示的なインターフェイスの実装 - C# プログラミング ガイド | Microsoft Docs

インターフェイス - C# リファレンス | Microsoft Docs