1

非常によく似ていて、他の型にキャストできる一連のクラスを作成したいと考えています。私の考えは、Interface オブジェクトを作成し、基本クラスを介して実装するというものでした。次に、ベースから継承する追加のクラスを作成します。その後、Interface を使用して共通 (基本) メソッドを操作し、オブジェクトを BASE オブジェクトからカスタム型にキャストできます。

interface ImyInterface {

}

public class MyBase : ImyInterface {

}

public class MyCustom1 : MyBase {

}

public class MyCustom2 : MyBase {

}


// in helper class
public static MyBase GetGeneralOjbect() {

    // get a generic base object
    return new MyBase();
}

// How I'm trying to use this

MyCustom1 obj = GetGeneralOjbect() as MyCustom1;

これは、オブジェクトステートメントのキャストを除いて機能するようです。静的ヘルパー GetGeneralOjbect が適切な MyBase オブジェクトを返す場合でも、MyCustom1 は常に null です。多分これはできないか、正しくやっていない。任意の入力をいただければ幸いです。

4

5 に答える 5

3

これは、MyCustom1またはMyCustom2をキャストできるためですがMyBase、必ずしもその逆であるとは限りません。

MyBaseviaを作成するとMyBase b = new MyBase();bMyBaseではなく であるため、へのMyCustom2キャストは失敗します。bMyCustom2

あなたができることは次のとおりです。

MyBase b = new MyCustom2();
MyCustom2 c = b as MyCustom2();

できない ことは次のとおりです。

MyBase b = new MyCustom2();
MyCustom1 c = b as MyCustom1();
于 2012-04-04T14:29:47.393 に答える
1

基本的に、継承チェーンをキャストできますが、ダウンすることはできません。次のクラス階層があるとします。

public class A {
}

public class B : A {
}

public class C : B {
}

タイプ B の新しいインスタンスをインスタンス化した場合、それを A にキャストできますが、C にはキャストできません。

于 2012-04-04T14:35:06.137 に答える
1

「as」キーワードは、「MyBase として静的に型指定されたこのオブジェクトの実行時型が MyCustom1 である場合は、MyCustom1 として静的に型指定されたオブジェクトを返してください。それ以外の場合は、null 参照を返してください」と述べています。キャストしているオブジェクトには、MyCustom1 ではなく MyBase のランタイム タイプがあります。これが、null 参照を取得している理由です。

于 2012-04-04T14:38:53.857 に答える
0

Factory Pattern の使用を検討しましたか?

于 2012-04-04T14:32:48.243 に答える
0

のインスタンスは、 のインスタンスが予期さMyCustom1れるときはいつでも使用できますが、が予期される場合には使用できません。MyBaseMyBaseMyCustom1

于 2012-04-04T14:33:09.023 に答える