2011-01-20 14 views
1

クラスaのxをクラスbのオブジェクトに仮想としてマークすることなく、クラスaのxを呼び出す方法。 (あなたが親のタイプを知らない場合には動作しませんが、上記のように) は、それはあなたができない型キャスト以外にも可能派生クラスのオブジェクトから仮想クラスを作成せずに基本クラスプロパティを呼び出す

public class a { public int x { get; set; } } 
public class b : a { public int x { get; set; } } 

public class c { 
    a _a = new a(); 
    b _b = new b(); 
    public c() 
    { 
     int y=_a.x; 
     y=_b.x; 
     _b.x = y; 
    } 
} 

答えて

4

base.x()は、bタイプ内で動作するはずです(ただし、ここには記載されていません)。

a tmp = _b; 
tmp.x = ... // talks to a.x, not b.x 

以上簡潔に:「メソッドの隠蔽」シナリオでは

(あなたが持っているもの)、それはまた、大部分は変数ががそうaにキャストすると、動作するはず、とを入力されるかに依存

((a)_b).x = ... // talks to a.x, not b.x 
0

ですので、私はこれらのクラスのいずれかを再構築助言します。おそらく、x仮想を作るか、あるいはクラスbの中のプロパティxを何か別のものに変更するか、bのxの実装の中でbase.xを呼び出すべきです。

+0

あなたの場合*具体的には '' a.x'が必要です。あなたは型を知っています...クラスの型は厳密には剛性です.... –

2

利用型キャスト:

public class c 
{ 
    a _a = new a(); 
    b _b = new b(); 

    void Test() { 
    int y = _b.x; // This is "x" of "b" 
    a _b_as_a = (a)_b; 
    int z = _b_as_a.x; // This is "x" of "a" of "b" 
    } 
} 
+0

ベースを使って動作できません。ベースキーワードを使って呼び出す必要がある場合、クラスをどのように構造化する必要がありますか。私は仮想を使って私が望むものを得ることができることを知っています。この質問はちょっとした疑問を解決するためのものです。 –

+0

@Shantanu 'base'は' 'c''のベース、aka' object'を意味します。 'this'以外のオブジェクトと話すときに' base'を使うことはできません。 –

関連する問題