この基本クラスから派生したクラスの型に一致するメンバーを宣言する抽象基本クラスがあるとします。派生クラスの型である抽象基本クラスのメンバーを宣言する方法はありますか?
public abstract class BaseClass
{
protected BaseClass parent;
}
public class DerivedClass1 : BaseClass
{
// parent could be of type DerivedClass2
}
public class DerivedClass2 : BaseClass
{
// parent could be of type DerivedClass1
}
各派生クラスでparent
フィールドがBaseClass
から派生何もすることができますので、これは動作しません。私はDerivedClass1
のparent
フィールドがDerivedClass1
であることを保証したいと思います。だから多分ジェネリックを使うべきだと思っています。
public abstract class BaseClass<T> where T : BaseClass<T>
{
protected T parent;
}
これは混乱しているように見えるかもしれませんが、コンパイルされます。基本的にはparent
がタイプT
であり、汎用BaseClass
から派生しなければならないと言っています。だから今派生クラスは、次のようになります。
public class DerivedClass : BaseClass<DerivedClass>
{
// parent is of type DerivedClass
}
を問題は、私は私がDerivedClass
を宣言する際に、型マッチングを自分自身を強制しなければならないということです。このような何かをやってから誰かを停止することは何もありません:ベースで宣言されたメンバの型が派生型が一致することを確認されるように
public class DerivedClass1 : BaseClass<DerivedClass2>
{
// parent is of type DerivedClass2
}
は、C#が、これを行う方法がありますか?
私は、これが何をこのC++質問をしようとしていたに似ていると思う:Abstract base class for derived classes with functions that have a return type of the derived class
これはCRTPと呼ばれます。 – SLaks
親プロパティを特定の型にしたい場合、その型が継承している基本クラスを心配する必要があるのはなぜですか?また、抽象クラスでこのプロパティを宣言する必要はありません。適切なクラスでプロパティを作成するだけです。 –
あなたの質問は不明です。つまり、あなたが望むものは明らかです。しかし、あなたは今、C#がそのような制約を提供していないことを知っていたはずです。さらに重要な点は、この制約が有用であると考えるあなたの質問は、_why_に関する詳細をゼロにしていることです。型パラメータ 'T'が実際に宣言型と同じでない場合、なぜあなたにとって重要なのでしょうか?それは基本クラスまたは派生クラスの実装にどのような影響を与えますか?あなたは何ができないでしょうか、あなたはそのような拘束をすることができますか?あなたの期待についての詳細を記入してください。 –