1

このインターフェイスとクラス定義には少し混乱しています。誰かが光を当てることができますか?

インターフェイスとそれを継承するクラスは、次のように定義されます。

public abstract class DNum {

}

public abstract class DNum<DIM> : DNum where DIM : DNum<DIM> { //etc...

...DIM : DNum<DIM>ビットが私を投げています。DIM は、現在定義しているクラスから継承する必要があり、それ自体をジェネリック パラメータとして使用しますか? これはある種の無限再帰的な定義ですか? 何が起きてる?

4

2 に答える 2

7

この種の宣言の通常の意図DIMは、具体的なサブクラスがそのサブクラスになることです。

public sealed class Concrete : DNum<Concrete>
{
    ...
}

通常、これは、同じタイプまたは非常に類似したタイプの新しいインスタンスを作成できるようにするためです。

(.NET の命名規則はDIM、型パラメーター名として嫌われることに注意してください。)

于 2012-07-01T07:15:28.983 に答える
1

Eric Lippert のブログへの Polity のリンクは、これらの奇妙な宣言の作成者の意図を理解するのに非常に役立ちます。

(意図が E. Lippert によって提案されたものである限り)、同じ種類の制約を表現する別の方法があることに注意してください。これは、はるかに安全で、読みやすく、理解しやすいものです。それは表現方法に依存します。

あなたのコード サンプルは意図を確立するのに十分明確ではないため、Eric Lippert の記事を読み、その意図が、あらゆる種類の動物が同じ品種の別の動物とのみ友達になることを許可することであると仮定します。

次に、そのようにすることができます:

abstract class Animal
{
    ...
}

public static class AnimalExtensions
{
    public static void MakeFriends(this T animal, T anotherT) where T : Animal
    {
        ...
    }
}

このテクニックを知っておくと非常に便利です (そしてまったく混乱することはありません)。

于 2012-07-01T15:00:50.300 に答える