1

基本クラス A と子クラスがあります。クラスのツリー構造を介してある種のキャストを構築する方法を探しています。

class A
{
   prop b;
   prop c;
   prop d;
   prop E[] e;
   prop F f;
}

class E
{
   prop g;
   prop h;
   prop J j;
}

class J
{
   prop k;
}

class F
{
   prop l;
}

今、インターフェイスまたは抽象クラスを介して継承を行うことができるかどうか疑問に思っています。これにより、次のようなさまざまな種類のキャストが得られます。

 (Cast1)A -> active props: c,d,E.g,E.J.k
 (Cast2)A -> active props: d,F.l
 (Cast3)A -> active props: b, E.h,E.g

これを達成する方法は?クラスのすべてのプロパティを常に使用する必要はないので、このキャストは役に立ちます。

結果は次のようになります。

var f1 = a as Cast1;
Console.WriteLine(f1.c);
Console.WriteLine(f1.d);
Console.WriteLine(f1.E[0].g);
Console.WriteLine(f1.E[0].h);// this NOT 
Console.WriteLine(f1.E[0].J.k);
Console.WriteLine(f1.E[1].g);

var f2 = a as Cast2;
Console.WriteLine(f2.d);
Console.WriteLine(f2.F.l);

var f3 = a as Cast3;
Console.WriteLine(f3.b);
Console.WriteLine(f3.E[0].h);
Console.WriteLine(f3.E[1].h);
Console.WriteLine(f3.E[2].h);
Console.WriteLine(f3.E[2].g);
4

2 に答える 2

1

あなたの質問を理解しているかどうかはよくわかりませんが、特定のインターフェイスに基づいてクラスをキャストしたいのですか?

interface IFoo
{
    void Hello1();
    void Hello2();
}

interface IBar
{
    void World1();
    void World2();
}

class A1 : IFoo, IBar
{
//.....
}

var a = new A1();

var f = a as IFoo; // Get IFoo methods.

Console.WriteLine(f.Hello1());

var b = a as IBar; // Get IBar methods.

Console.WriteLine(b.World2());

間違った考えを持っている場合はご容赦ください。適切でない場合は、回答を削除します。

于 2013-10-01T10:13:07.927 に答える
0

あなたの質問を理解できれば、いくつかのインターフェースを定義し、メインクラスにそれらすべてを実装させることで、あなたが望むことを達成できます。

interface ICast1
{
    prop c;
    prop d;
    E e;
}

interface ICast2
{
    prop d;
    F f;
}

class A : ICast1, ICast2
{
    prop c;
    prop d;
    E e;
    F f;
}

ICast1orにキャストしてICast2、必要なビューのみを取得できるようになりました。

ただし、あなたの例はもう少し複雑で、Eフィルタリングもされています。ここではもっと複雑なものが必要になります - 2 つの異なるEインターフェースを持ち、それらをICastインターフェース内でオーバーラップさせます。明示的なインターフェイスの実装を使用して、それらを区別できます。

interface E1
{ 
     prop g;
     prop h;
}
interface E2
{
     J j;
}
class E : E1, E2
{
     prop g; prop h; J j;
}
interface ICast1
{
    E1 e;
}
interface ICast2
{
    E2 e;
}
class A : ICast1, ICast2
{
    E1 ICast1.e {get;set;}
    E2 ICast2.e {get;set;}
}
于 2013-10-01T10:15:33.033 に答える