バックグラウンド
[背景に興味がない場合は、質問にスキップしてください]
先日読んでいるときに、この汎用クラス定義に出くわし、しばらくの間困惑しました。
public abstract class Entity<T> where T : Entity<T>
タイプ自体がどうなっT
ているのかと戸惑いました。ある種の奇妙な再帰的制約のように見えました。Entity<T>
Entity<T>
次に、この制約はサブクラス化によって満たすことができることに気付きました (もちろん、これabstract
はクラスに要求されることです)。
public class Deriver : Entity<Deriver>
ここで、 typeT
はから派生しているEntity<T>
ため、型であることが保証されています。Deriver
Entity<Deriver>
質問
とにかく、クラスが抽象クラスでない場合、それを直接インスタンス化できるのではないかと思いました。
与えられた
class Entity<T> where T : Entity<T>
Entity<T>
直接インスタンス化できますか?
明らかに、次のことは言えません。
Entity<SomeClass> e = new Entity<SomeClass>();
SomeClass
制約を満たさないからwhere T : Entity<T>
です。
明らかな「なぜそれをしたいのですか?」を無視します。abstract
これは本質的に、キーワードを使用せずにクラスを使用する前にクラスが確実に派生されるようにする方法ですか?