2011-02-01 17 views
0

今まで、私はこの1つのようなクラスだった:ジェネリック制限

type C<'a when 'a :> A> (...) 

をしかし、今、私は新しいタイプB作成:

type B (...) = 
    inherit A() 

をしかし、私はサポートするために、CをしたくありませんB、これはコンパイルされません。

type C<'a when 'a :> A and not 'a :> B> (...) 

どうすればいいですか?

答えて

9

あなたはそうすることはできません。 BがAの場合、Cはそれを処理する必要があります。 CがBを処理できないことが妥当であれば、BはAから派生すべきではありません。そうでなければ、実質的にLiskov's Substitution Principle(または少なくとも同じものの変形)を破棄しています。

BがAから継承すると宣言すると、Aとして使用できると言われます。そうでない場合は、継承を使用しないでください。

+0

でも可能な場合でも、とにかくBをAにキャストすることで依然として壊れてしまいます。 – Massif

+0

私はそれがOOP標準では間違っていることを知っていますが、私は継承を継承する複雑なシナリオを持っていますが、Bは本当にAではありません。 A. –

+1

@Ramon:意外にも、あなたが相続を濫用するとき、あなたはこのような問題に対して立ち上がるでしょう。私はあなたのデザインを再考することを強く勧めます。 –