2009-07-31 25 views
5

f#でクラスを作成する方法にはこの二分法がありますので、実際に私を悩ませるものです。私は、暗黙の形式か明示的な形式のどちらかを使ってクラスを作成できます。しかし、私が望む機能のいくつかは、暗黙の形式でのみ使用でき、一部は明示的な形式でのみ使用できます。例えばF#オブジェクト指向プログラミングについて

:私は明示的に定義されたクラス内let inline *(単独let)を使用することはできません

  1. 。暗黙的に定義されたクラス内で不変公共フィールド(ない性質*)を定義するための

  2. 唯一の方法は、(私が知っている)val bla : bla構文です。

    ここには冗長性があります。私は暗黙のモードではコンストラクタパラメータがクラス全体に存続するため、同じ不変データの2つのコピー、すなわち1つのプライベートと1つのパブリックに終わるので、

  3. (これはあまり関係ありません)属性を使用する必要性メソッドのオーバーロードとフィールドのデフォルトのためには、やっかいです。

とにかく私はこれを回避できますか?

EDITパフォーマンス上の理由から

*

:私は両方のポイント(感謝ガネーシュ・シタンパラム& MichaelGG)について間違ってい判明します。私は両方の暗黙的&明示的なクラス定義で let inlineを使用することはできませんが

  1. 、私は同じことを前提とうまくmember inlineを、使用することができます。

  2. クラス本体で使用されていないパラメータはコンストラクタにとってローカルなので、最新のF#ではどうやら冗長性がなくなっているようです。

  3. Will be gone次のF#リリースで。

+0

「パフォーマンス上の理由から」?私はそれの音が好きだとは言いません;) – Juliet

+0

これは、グラフィックスプログラミングに関連しているのは、ほとんどの場合、数字のクランチです。こちらをご覧ください:http://blogs.msdn.com/ricom/archive/2006/09/07/745085.aspx –

+0

あなたの質問は、あなたが解決しようとしている問題を示唆するものではありません。私はF#でC++スタイルのオブジェクト指向プログラミングをエミュレートしたいと思っています。あなたがいないなら私を訂正してください!しかし、なぜあなたは機能的な言語でこれを必要としましたか?私はこれがあなたが取り組んでいる問題に特有だと思うし、あなたがここで詳細な投稿をすれば面白いかもしれない。 –

答えて

5

これは役に立ちませんが、メンバーをインライン化できます。 「メンバーインラインプライベート」はうまく動作します。

+0

これは役に立ちます。ありがとう。私は明示的な構文を使用して解決することを意味します。 –

1

let inlineについて、あなたはクラスの外に移動し、明示的に呼び出すときに、クラスのスコープ内から必要な任意の値を渡すことで回避することができます。それがインラインになるので、これを行うためのパフォーマンス上のペナルティはありません。

関連する問題