1

データのみで構成されるクラス階層があります。例えば:

class A 
{
    List<B> b { get; set; }
    C c { get; set; }
}

class B 
{ 
    int d { get; set; }
}

class C 
{
    List<int> e { get; set; }
}

クラス階層は、XML と protobuf-net の両方を使用してシリアル化できるように準備されています。また、2 つの異なるアプリケーションで使用する必要があるため、別のライブラリにも存在します。

ここで、このクラス階層の拡張バージョンを作成する必要があります。ここでは、ノードの数とそれらの関係は同じですが、それぞれに追加のデータ、メソッド、またはプロパティが存在する可能性があります。例えば:

class AA : A
{
    int extra { get; set; }
}

class BB : B
{
    float extra { get; set; }
    void something();
}

class CC : C
{
    float extra { get; set; }
}

上記の問題の 1 つは、クラス間のすべての (継承された) 参照が元の階層の型、つまりList<B>の代わりにまだ使用しList<BB>ているため、常に新しい型にキャストする必要があることです。より大きな問題は、拡張された階層から元の階層をシリアル化できるようにする必要があることです。これは、すべてのインスタンスが派生型である場合には実行できませんでした。

質問:完全なクラス階層を拡張して、純粋なデータ オブジェクト モデルをどこかに共有し、元の構造を失うことなく外部から情報や動作を追加できるようにする方法はありますか?

4

2 に答える 2

3

ジェネリックを使用してやりたいことができると思います。少なくとも、キャストを防ぐためのソリューションについては。拡張された階層から元の階層をシリアル化する方法についてはまだ考えています。

質問の B、BB、C、および CC クラスは同じままです。

まずジェネリック A クラス:

class A<BType, CType> where BType: B where CType: C {
    List<BType> b { get; set;}
    CType c { get; set;}
}

次に、ジェネリック A クラスを使用する非ジェネリック A クラス:

class A: A<B, C> {
}

そして、ジェネリック A クラスも使用する (非ジェネリック) AA クラス:

class AA: A<BB, CC> {
    int extra { get; set; }
}
于 2013-06-12T05:50:28.703 に答える