2011-07-03 13 views
5

Krzysztof CwalinaとBrad Abramsがフレームワークデザインガイドライン第2版の拡張メンバーに関するセクションを読み終えたばかりで、この例は見つかりませんでした。私の質問は、F#ライブラリのスーパークラスとサブクラスに関係しますが、その答えはすべての.NET言語に関連していると思います。拡張メソッド設計ガイドライン:サブクラスとスーパークラスで同じメソッド名を使用する必要がありますか?

F#には、スーパータイプExprとサブタイプExpr<'a>の2種類があります。後者は、前者の型付きバージョンの単なるラッパーです。これらは、引用式に使用される型です。私はよりよい設計されるであろう、それらを評価するためのこれらのタイプの拡張メソッドを定義したい場合は

  1. ドのF#のパワーパックとして行い、異なる名前Expr<'a>ExprEvalUntyped() : Expr -> objEval() : Expr<'a> -> 'aと定義されたメソッド。
  2. 型を所有していて同じ名前を使用している場合(たとえば、スーパー型のメソッドは仮想型と考えることができます。サブ型のメソッドは、その型をオーバーライドすると考えることができます)スーパー仮想メソッド)。すなわちEval() : Expr -> objExprで、Eval() : Expr<'a> -> 'aExpr<'a>です。

2番目の選択肢は私にとっては正しいと思われますが、設計指針があればそれに従っていきたいと思います。これは権威的な優先順位ですか(PowerPackで「間違っている」と思われます)。

+2

推奨事項がわかりません。注目すべきは、 'Eval'が標準の仮想メソッドであれば、派生型はその型を変更できないということです。 (引数は 'Expr'でなければなりません。結果を' obj'から 'a'に変更することも許されませんが、タイプサウンドとなります。) –

+0

ああ、良い点です。 IEnumerable.GetEnumerator()とIEnumerable <'a> .GetEnumerator()です。 –

答えて

1

これには明確な答えがないかもしれません。

  1. は、他の開発者が、既にF#と公式の拡張機能で作業するもので一貫したスタイルを保つために:あなたは本当に信じている場合を除きしかし、F#PowerPackには、私は2つの理由で自分のスタイルをたどるだろう、「間違った」デザインを手に入れました。
  2. 2つのメソッドの戻り値の型の違いをより明示するために、それは重要です。

Tomasへの返信であなたのアナロジーは良いものですが、私はこのコードを使用している他の開発者も、あなたが持っているデザインに注意を払っていない可能性があります。公式のスタイルと一貫性を保ち、あなたの意図を明示することがベストです。

+0

良い点David、ありがとう。フレームワークデザインガイドラインは、より良いデザインであっても一貫性を失うことに注意しています。私はPowerPackのデザインが最初に遭遇したときに混乱しているのを発見したと言います。それは、型付き引用符と型付き引用符との間を移動するときに余計な問題を引き起こします。 –

関連する問題