public abstract class MyClass<TMyClass> : MyClass
where TMyClass: MyClass<TMyClass>
{
...
}
最初に指摘することは、これが別の抽象クラスから継承している抽象クラスであることです。言い換えれば、これはインスタンス化できない (別のクラスがそれを継承しない) クラスですが、継承を使用して別の抽象クラスから機能を派生させています (これは問題ありません)。
指摘する 2 番目のことは、これが型を受け入れる Template クラス (または C# で呼び出すジェネリック クラス) であることです。T が常にテンプレートになるように、慣例としてそれを T に減らしますが、何と呼ぶかは完全にあなた次第です。
最後に、これには一種の奇妙な制約があります。何があっても、(継承チェーンのどこかで) から継承しない限り、コンパイラはクラス型をテンプレート型として渡すことを許可しません。
MyClass<TMyClass>
これは次の行に示されています
where TMyClass: MyClass<TMyClass>
基本的に、これにより、このルールに従わないオブジェクトを渡すことができなくなります。
少し奇妙なのは、テンプレートによって渡された型が実際にそれ自体の型でない限り、制約がそれをテンプレートにすることはできないことを実装者に伝えていることです。このクラスの設計者 (または実装者) は、これが賢明な設計であるかどうかを判断する必要がありますが、これ自体は少し奇妙に見えます。