Krzysztof CwalinaとBrad Abramsがフレームワークデザインガイドライン第2版の拡張メンバーに関するセクションを読み終えたばかりで、この例は見つかりませんでした。私の質問は、F#ライブラリのスーパークラスとサブクラスに関係しますが、その答えはすべての.NET言語に関連していると思います。拡張メソッド設計ガイドライン:サブクラスとスーパークラスで同じメソッド名を使用する必要がありますか?
F#には、スーパータイプExpr
とサブタイプExpr<'a>
の2種類があります。後者は、前者の型付きバージョンの単なるラッパーです。これらは、引用式に使用される型です。私はよりよい設計されるであろう、それらを評価するためのこれらのタイプの拡張メソッドを定義したい場合は
:
- ドのF#のパワーパックとして行い、異なる名前
Expr<'a>
上Expr
上EvalUntyped() : Expr -> obj
とEval() : Expr<'a> -> 'a
と定義されたメソッド。 - 型を所有していて同じ名前を使用している場合(たとえば、スーパー型のメソッドは仮想型と考えることができます。サブ型のメソッドは、その型をオーバーライドすると考えることができます)スーパー仮想メソッド)。すなわち
Eval() : Expr -> obj
はExpr
で、Eval() : Expr<'a> -> 'a
はExpr<'a>
です。
2番目の選択肢は私にとっては正しいと思われますが、設計指針があればそれに従っていきたいと思います。これは権威的な優先順位ですか(PowerPackで「間違っている」と思われます)。
推奨事項がわかりません。注目すべきは、 'Eval'が標準の仮想メソッドであれば、派生型はその型を変更できないということです。 (引数は 'Expr'でなければなりません。結果を' obj'から 'a'に変更することも許されませんが、タイプサウンドとなります。) –
ああ、良い点です。 IEnumerable.GetEnumerator()とIEnumerable <'a> .GetEnumerator()です。 –