rksoftware

Visual Studio とか C# とかが好きです

C# 2.0 以降の新機能の確認 - C# 8.0 - 既定のインターフェイス メソッド

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

既定のインターフェイス メソッド

 https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/default-interface-methods-versions
 インターフェイスに実装がもてる。

// 実装を持ったインターフェイス
interface IA
{
    int Method1();
    int Method2() => 2;  // 2 を返す実装のメソッド
}

// 実装を持ったインターフェイスを実装するクラス
class A : IA
{
    public int Method1() => 1;
    // インターフェイスに実装がある Method2 はクラスで実装しなくてもよい (してもよい)
}

 クラスで実装しない場合は、Method2 はインターフェイスの型の変数でないと使えない。

var a = new A();
Console.WriteLine($"Method1 = {a.Method1()}, Method2 = {a.Method2()}");  // ← クラスで実装していないためエラー

// 実装を持っているインターフェイスの型にすれば使える
var ia = (IA)a;
Console.WriteLine($"Method1 = {ia.Method1()}, Method2 = {ia.Method2()}");

 クラスで実装すると常にクラスの実装が使われる。

var a = new A();
// どちらも 1 が出力される
Console.WriteLine($"Method2 = {a.Method2()}");
Console.WriteLine($"Method2 = {((IA)a).Method2()}");

interface IA { int Method2() => 2; }

class A : IA { public int Method2() => 1; }