0

バックグラウンド

[背景に興味がない場合は、質問にスキップしてください]

先日読んでいるときに、この汎用クラス定義に出くわし、しばらくの間困惑しました。

public abstract class Entity<T> where T : Entity<T>

タイプ自体がどうなっTているのかと戸惑いました。ある種の奇妙な再帰的制約のように見えました。Entity<T>Entity<T>

次に、この制約はサブクラス化によって満たすことができることに気付きました (もちろん、これabstractはクラスに要求されることです)。

public class Deriver : Entity<Deriver>

ここで、 typeTはから派生しているEntity<T>ため、型であることが保証されています。DeriverEntity<Deriver>

質問

とにかく、クラスが抽象クラスでない場合、それを直接インスタンス化できるのではないかと思いました。

与えられた

class Entity<T> where T : Entity<T>

Entity<T>直接インスタンス化できますか?

明らかに、次のことは言えません。

Entity<SomeClass> e = new Entity<SomeClass>();

SomeClass制約を満たさないからwhere T : Entity<T>です。

明らかな「なぜそれをしたいのですか?」を無視します。abstractこれは本質的に、キーワードを使用せずにクラスを使用する前にクラスが確実に派生されるようにする方法ですか?

4

1 に答える 1

2

その仮定は正しくありません。以下がコンパイルされます。

var e = new Entity<Deriver>();
于 2013-02-15T10:55:18.820 に答える