私は、.NET 4でしばらくの間、限られた方法でオプションのパラメーターを使用してきました。最近、オプションのパラメーターがどのように実装され、何かが私に夜明けを迎えたかについて考えました。
次の例を見てください。
public interface ITest
{
void Go(string val = "Interface");
}
これを実装するための唯一の要件は、署名の最大形式をvoid Go (string val)
実装することです。実際、コンパイラがそのワイヤアップを処理するため、オプションのパラメータを実装する必要はありません(ただし、オプションのパラメータを使用するオプションは使用時に使用できません)具体的なクラス)。
そうは言っても、両方の場所で機能を提供し、実装で検出できるようにするには、インターフェイスと実装の両方でオプションの宣言を実装できます。実際、生産性ツールReSharperは、インターフェースを実装するときに、このオプションの宣言を具象型に自動的にプルアップします。これは論理的なことのようです。でも...
具体的なタイプとインターフェースで異なる値を使用しないようにするにはどうすればよいですか?これは今朝、誰かがその値を変更するために入って、オーバーライド/インターフェイスの継承にそれを保持するのを忘れたかのように私の警報ベルを鳴らしました、動作はオブジェクトへのアクセス方法によって完全に異なります。これは、デバッグするのに非常にイライラする可能性があります。
このLINQpadスクリプトを試してください:
void Main()
{
IA iface = new A();
A cls = new A();
iface.Go();
cls.Go();
}
interface IA
{
void Go(string val = "Interface");
}
class A : IA
{
public void Go(string val = "Class") { val.Dump(); }
}
出力は次のようになります。
Interface
Class
それは私の実際の質問に私をもたらします:
質問:
具象クラスのオプションのパラメーターバリアントを使用する機能を失うことなく、これを保護する方法(ある場合)は何ですか?したがって、それはコーダーにとって検出可能/読み取り可能ですか?
誰かが以前にこの問題に遭遇したことがありますか?どのようにそれを解決しましたか?この問題がマルチ開発者の大規模なコードベースで蔓延するのを防ぐのに役立つ可能性のあるベストプラクティスはありますか?