私の最初の質問は、なぜこれがコンパイルされるのですか?
違反していると思われる仕様のルールはどれですか?
まだ定義されていないクラスを実装しているようです。
ステートメントが正確であるかどうかを判断するには、これらの各用語の正確な意味を指定する必要があると思います. コンパイラーはCompositePresentationEvent
、それが他の場所で宣言されていることを認識しており (おそらく)、それが宣言されSomeEvent
ているクラスであることを認識しています。クラス内にタイプのフィールドを持つようなものです - 完全に有効です。Foo
Foo
これを実行できることも非常に便利です- 特に比較のために。例えば:
public sealed class Foo : IComparable<Foo>
クラスのインスタンスはFoo
、それ自体を別のインスタンスと比較する方法を知っているため、タイプセーフな方法でソートに使用できると言います。構造体の場合、適切に実装される型であることがわかっているx.CompareTo(y)
場合、呼び出しでボクシングが不要になるため、ボクシングを減らすこともできます。x
IComparable<>
型は、はるかに興味深く、紛らわしいほど再帰的になる可能性があることに注意してください。Protocol Buffers の私のポートから、この (少し変更された) 例を取り上げます。
public interface IMessage<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
public interface IBuilder<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
ここでの目的は、基本的に "メッセージ" と "ビルダー" の 2 つのタイプで終わることであり、いつでも相互に構築できるようになっています。例えば:
public class Foo : IMessage<Foo, FooBuilder>
{
...
}
public class FooBuilder : IBuilder<Foo, FooBuilder>
{
...
}