-2

この基本クラスから派生するクラスの型と一致するメンバーを宣言する抽象基本クラスがあるとします。

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各派生クラスのフィールドは から派生したものになる可能性があるため、これは機能しませんBaseClassparentのフィールドDerivedClass1が型のみであることを確認したいDerivedClass1。だから私はおそらくジェネリックを使うべきだと考えています。

public abstract class BaseClass<T> where T : BaseClass<T>
{
    protected T parent;
}

これは紛らわしく循環しているように見えるかもしれませんが、コンパイルされます。基本的には、ジェネリックから派生する必要parentがあるタイプです。したがって、派生クラスは次のようになります。TBaseClass

public class DerivedClass : BaseClass<DerivedClass>
{
    // parent is of type DerivedClass
}

問題は、宣言するときに自分で型の一致を強制する必要があることDerivedClassです。誰かがこのようなことをするのを止めるものは何もありません:

public class DerivedClass1 : BaseClass<DerivedClass2>
{
    // parent is of type DerivedClass2
}

ベースで宣言されたメンバーの型が派生型と確実に一致するように、C# にはこれを行う方法がありますか?

これは、この C++ の質問が尋ねようとしていたものと似ていると思います:派生クラスの戻り値の型を持つ関数を持つ派生クラスの抽象基本クラス

4

1 に答える 1