インターフェイスで定義された C# 4 オプション パラメータが実装クラスに強制されないのはなぜですか? 質問する

インターフェイスで定義された C# 4 オプション パラメータが実装クラスに強制されないのはなぜですか? 質問する

C# 4 のオプション パラメーターでは、インターフェイスでオプション パラメーターを指定すると、実装クラスでそのパラメーターをオプションにする必要がないことに気付きました。

public interface MyInterface
{
    void TestMethod(bool flag = false);
}

public class MyClass : MyInterface
{
    public void TestMethod(bool flag)
    {
        Console.WriteLine(flag);
    }
}

したがって:

var obj = new MyClass();        
obj.TestMethod(); // compiler error

var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false

オプションパラメータがこのように動作するように設計されている理由を知っている人はいますか?

一方で、インターフェースで指定されたデフォルト値をオーバーライドする機能は便利だと思いますが、正直なところ、インターフェースでデフォルト値を指定できるかどうかはわかりません。これは実装上の決定である必要があるからです。

一方、この分離は、具象クラスとインターフェースを常に互換的に使用できるわけではないことを意味します。もちろん、実装でデフォルト値が指定されている場合は問題になりませんが、具象クラスをインターフェースとして公開している場合 (たとえば、具象クラスを挿入するために何らかの IOC フレームワークを使用している場合)、呼び出し側が常にデフォルト値を提供する必要があるため、デフォルト値を持つ意味はありません。

ベストアンサー1

アップデート:この質問は、2011 年 5 月 12 日の私のブログのテーマでした。素晴らしい質問をありがとうございます。

あなたが説明したようなインターフェースがあり、それを実装するクラスが 100 個あるとします。次に、インターフェースのメソッドの 1 つについて、パラメーターの 1 つをオプションにすることにしました。コンパイラーが開発者にそのインターフェース メソッドのすべての実装を見つけさせ、パラメーターもオプションにするのが正しいやり方だとおっしゃっているのですか?

これを実行したと仮定します。開発者が実装のソース コードを持っていなかったと仮定します。


// in metadata:
public class B 
{ 
    public void TestMethod(bool b) {}
}

// in source code
interface MyInterface 
{ 
    void TestMethod(bool b = false); 
}
class D : B, MyInterface {}
// Legal because D's base class has a public method 
// that implements the interface method

D の作成者は、これをどのように機能させるのでしょうか? あなたの世界では、B の作成者に電話をかけ、メソッドにオプションのパラメータを持たせる新しいバージョンの B を送ってもらうように依頼する必要がありますか?

それは通用しません。2人が B の作者に電話をかけ、そのうちの 1 人がデフォルトを true にしたいと考え、もう 1 人が false にしたいと考えた場合はどうなるでしょうか。B の作者が単にそれに応じない場合はどうなるでしょうか。

おそらくその場合、彼らは次のように言う必要があるでしょう。

class D : B, MyInterface 
{
    public new void TestMethod(bool b = false)
    {
        base.TestMethod(b);
    }
}

提案された機能は、プログラマーにとって多くの不便を追加するものの、それに応じた代表権の増加はないようです。ユーザーにとってのコスト増加を正当化する、この機能の魅力的な利点は何ですか?


更新: 以下のコメントで、supercat は、言語に真のパワーを追加し、この質問で説明されているようなシナリオを可能にする言語機能を提案しています。参考までに、その機能 (インターフェイス内のメソッドのデフォルト実装) は、C# 8 に追加される予定です。

おすすめ記事