インターフェイスメソッドでオプションのパラメータを宣言できますが、 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) { }
}
例:
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
になります。
そうする理由は、呼び出し元が持っているコンパイル時の型が単なるインターフェースである場合に、呼び出し元が使いやすくするためです。
public void Foo(IService1 service)
{
service.MyMethod("Text"); // Calls MyMethod("Text", false)
}
呼び出し元が具体的な型ではなく、何かが実装するインターフェースについてのみ知っていることはかなり一般的です-したがってifオプションのパラメーターはまったく良い考えであると信じています(物議を醸しています)具象型のようにインターフェース上でそれらを。
パラメータFoo
を受け取るメソッドBar
を使用してインターフェイスを設計し、Foo
への呼び出しの99%(100%ではない)がBar
、次のいずれかを行う必要があります。
オプション#3は、実行可能である場合に最も便利なようです。
インターフェイスが希望どおりに宣言できるので、インターフェイスを作成するときに必要な正確な柔軟性が得られるので便利です。つまり、派生クラスの実装者は、必要に応じてパラメーターをオプションにしたり、必須にしたりすることができます。オプションでない場合は、派生クラスにそれが必要です。
上記の例はまさにそれを示しています-派生クラスの柔軟性。
インターフェイス設計者によるデフォルトパラメータの想定は、実装者の設計とは異なる場合があります。
デフォルトのパラメーターはコンパイラーによって単純に拡張され、パラメーターは実際のデフォルト値に置き換えられます。
インターフェイスのインスタンスであるオブジェクトでメソッドを呼び出すと、コンパイラはインターフェイスで指定されたデフォルト値を置き換えます。
また、クラスのインスタンスであるオブジェクトでメソッドを呼び出すと、コンパイラはクラスで指定されたデフォルト値を置き換えます。