この基本クラスから派生するクラスの型と一致するメンバーを宣言する抽象基本クラスがあるとします。
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
。parent
のフィールドDerivedClass1
が型のみであることを確認したい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++ の質問が尋ねようとしていたものと似ていると思います:派生クラスの戻り値の型を持つ関数を持つ派生クラスの抽象基本クラス