2009-04-07 7 views
9

基本クラスと2つの派生クラスがあり、2つの派生クラスの間でキャストを手作業で実装したい場合、それを行う方法はありますか? (C#で)オーバーライド(キャスト)

abstract class AbsBase 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
} 

class Imp_A : AbsBase 
{ 
    private List<int> E; 
} 


class Imp_B : AbsBase 
{ 
    private int lastE; 
} 

は、一般的に私はImp_Aからキャストされます - > Imp_Bと私はEリストの最後の値が「LastE」になりたいです。 また、3つ以上の実装クラス(給与、時間別、コンサルタント、従業員など)がある場合はどうでしょうか?

構造的に健全かどうかにかかわらず(アプリケーション全体を簡潔に記述することはできません)出来ますか?

コンバーターを書くつもりだったのですが、コンバーターはImp_Bクラスの新しいオブジェクトを作成します。これは、「従業員」はいずれかのオプションの1つにすぎないためです時間。あなたはIMPAを「治療」するため

class Imp_B : Imp_A 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
    private int lastE { get { return this.E.Last(); } } 
} 

あなたが実際にIMPBから派生することができない場合は、それは不可能です:

-Devin

答えて

19

explicitまたはimplicit演算子を実装する必要があります。

class Imp_A : AbsBase 
{ 
    public static explicit operator Imp_B(Imp_A a) 
    { 
     Imp_B b = new Imp_B(); 

     // Do things with b 

     return b; 
    } 
} 

これで、次のことが可能になりました。

Imp_A a = new Imp_A(); 
Imp_B b = (Imp_B) a; 
+1

これは本当にまったく新しいImp_Bオブジェクトを作成することに注意してください。 – mquander

+0

これは完璧です。しかし、mquanderが言及しているように、それは避けられないと私が信じる新しい目的です。しかし、これは、たとえ私が(Imp_Aとして)再び使用することはないとしても、 "a"は範囲外になるまでGCしないだろうか? – DevinB

+0

はい、範囲外になり、参照を保持しなくなった場合にのみ収集されます。 –

2

私は、可能な場合は、このようImp_Bを書くことをお勧めしたいですあなたが好きなやり方で透過的にImpBとして扱うことができます。なぜなら、彼らはちょうどメモリ内で同じものではないからです。したがって、明示的な変換を実装します。

+0

申し訳ありませんが、あなたは正しい、私はまた、-D – DevinB

+0

を削除します、これらのクラスは、それぞれに排他的である特定の変数で、はるかに複雑になります。そして、直接関連しているが必ずしも同じではない特定の変数(Eのような)。 – DevinB