1

私はインターフェースを持っています

interface IFooWidget
{
     IWidget Get(string widgetName);
}

私の質問は、エラーの場合の戻りセマンティクスを実装者に伝えるにはどうすればよいですか? つまり、要求されたウィジェットが見つからない場合、null 値をスローまたは返す必要があります。これはインターフェイス定義の重要な部分のようですが、私には表現できません。

それを文書化することが唯一の方法であるように思われます-人間が話すのではなく、コンパイラーが話すように何らかの方法でそれを入れることができれば、はるかに良いでしょう。

誰かが解決策や考えを持っているかどうか疑問に思っています...

コンセンサス回答:

インターフェイスはセマンティクスではなく構文を定義します。私は自分のメソッド定義の英語性に魅了されていました。それが代わりだったら想像してみてください

IWidget Fnargle(string wobbler);

もちろん、これはコンパイラにどのように見えるかです。呼び出しのセマンティクスは、元の質問で示唆されていました。これは、役立つと思われるメソッド名とパラメーターを選択したためです。しかし、実際には、メソッドのセマンティクスのすべての側面を文書化する必要があります-避けられません

4

4 に答える 4

1

メソッドからスローされる可能性のある例外を指定する組み込みの方法はありません。C# には、Java と同様のチェック例外がありません。呼び出し元がエラーを確実に処理するようにする場合は、例外ハンドラーのパラメーターを追加できます。

interface IFooWidget
{
     IWidget Get(string widgetName, Action<ExceptionType> handler);
}
于 2013-01-04T22:25:33.930 に答える
0

そうですね、これをC#で表現できるとは思いません(他のほとんどの現代語のように)。

IMHOインターフェースは、実装の詳細を表現しないためのものだと思います。メソッド(インターフェースで指定されたもの)が特定の条件が真である場合にのみ何かを返すようにしたい場合、これはむしろ実装の詳細であると言う傾向があります。

インターフェイスで定義されたメソッドは、考えられるすべての実装の中で最も一般的でない部分です。つまり、メソッドの署名は、メソッドの実装方法(または実装する必要がある)に関するステートメントではありません。

于 2013-01-04T22:22:45.503 に答える
0

C# でこれを正式に文書化または強制する方法はありません。

実際、インターフェースは多くのものを表現しません。これらは、渡されるデータまたは渡されるデータの事前条件および事後条件を表していません。それらデータ形式 (引数の型と数) を表現しますが、それは特定のメソッドの契約の小さな部分です。

ここで役立つツールがいくつかあります。コード コントラクトが思い浮かびます。それらは、これらの条件を表現する別の方法を作成するだけです。それらは静的に強制しません。

于 2013-01-04T22:16:03.900 に答える
0

インターフェイスでこれを指定するオプションがあるとは思いません。1つのオプションは、あなたが提案したようにコメントを追加することです. 以下のようなコメントが実装者向けの IntelliSense に表示されます。

/// <exception cref="Exception"></exception>

.Net 4.5 を使用している場合は、System.Diagnostics.Contracts 名前空間を使用して事後条件を指定し、Contract.Ensuresを使用して結果が null にならないようにすることができます。残念ながら、インターフェイスにコントラクトを追加するのは少し面倒です。これを行う方法の詳細については、ContractClassAttributeに関する Microsoft ドキュメントを参照してください。

于 2013-01-04T22:30:18.303 に答える