web-dev-qa-db-ja.com

インターフェイスでオプションのパラメータを宣言する理由はありますか?

インターフェイスメソッドでオプションのパラメータを宣言できますが、 Eric Lippertの説明 のように、パラメータをオプションとして宣言するためにクラスを実装する必要はありません。逆に、実装クラスではパラメータをオプションとして宣言できますが、インターフェイスでは宣言できません。

では、インターフェイスでオプションのパラメータを宣言する理由はありますか?そうでない場合、なぜそれが許可されますか?

例:

public interface IService1
{
    void MyMethod(string text, bool flag = false);
}

public class MyService1a : IService1
{
    public void MyMethod(string text, bool flag) {}
}

public class MyService1b : IService1
{
    public void MyMethod(string text, bool flag = true) { }
}

public interface IService2
{
    void MyMethod(string text, bool flag);
}

public class MyService2b : IService2
{
    public void MyMethod(string text, bool flag = false) { }
}
22
Jamie Ide

例:

public interface IService1
{
    void MyMethod(string text, bool flag = true);
}

public class MyService1a : IService1
{
    public void MyMethod(string text, bool flag) { }
}

使用法:

IService1 ser = new MyService1a();
ser.MyMethod("A");

MyService1aに渡される2番目のパラメーターは、インターフェースのデフォルトパラメーターとしてtrueになります。

23

そうする理由は、呼び出し元が持っているコンパイル時の型が単なるインターフェースである場合に、呼び出し元が使いやすくするためです。

public void Foo(IService1 service)
{
    service.MyMethod("Text"); // Calls MyMethod("Text", false)
}

呼び出し元が具体的な型ではなく、何かが実装するインターフェースについてのみ知っていることはかなり一般的です-したがってifオプションのパラメーターはまったく良い考えであると信じています(物議を醸しています)具象型のようにインターフェース上でそれらを。

20
Jon Skeet

パラメータFooを受け取るメソッドBarを使用してインターフェイスを設計し、Fooへの呼び出しの99%(100%ではない)がBar、次のいずれかを行う必要があります。

  1. パラメータ `Bar`を含む、または含まないインターフェイスメソッドオーバーロードに含めるため、そのインターフェイスのすべての実装に追加のメソッドを含める必要がありますが、呼び出し元はそれを指定する必要がありません。
  2. `Bar`を含むメソッドのみを含めると、実装者は追加のメソッドのコストを節約できますが、すべての呼び出しサイトに追加のパラメーターを含める必要があります。
  3. インターフェース内でパラメーターをオプションとして定義し、実装者とコンシューマーの両方にとって便利なものにします。

オプション#3は、実行可能である場合に最も便利なようです。

3
supercat

インターフェイスが希望どおりに宣言できるので、インターフェイスを作成するときに必要な正確な柔軟性が得られるので便利です。つまり、派生クラスの実装者は、必要に応じてパラメーターをオプションにしたり、必須にしたりすることができます。オプションでない場合は、派生クラスにそれが必要です。

上記の例はまさにそれを示しています-派生クラスの柔軟性。

1
Ed Bayiates

インターフェイス設計者によるデフォルトパラメータの想定は、実装者の設計とは異なる場合があります。

デフォルトのパラメーターはコンパイラーによって単純に拡張され、パラメーターは実際のデフォルト値に置き換えられます。

インターフェイスのインスタンスであるオブジェクトでメソッドを呼び出すと、コンパイラはインターフェイスで指定されたデフォルト値を置き換えます。

また、クラスのインスタンスであるオブジェクトでメソッドを呼び出すと、コンパイラはクラスで指定されたデフォルト値を置き換えます。

0
Akash Kava