2011-05-24 32 views
1
class AlphaBase 
{ 
    public bool PropA { get; set; } 
} 

class AlphaA : AlphaBase 
{ 
    public bool PropB { get; set; } 
} 

class BetaBase 
{ 
    protected AlphaBase MAlpha; 
    public BetaBase(AlphaBase rAlpha) 
    { 
     MAlpha = rAlpha; 
    } 

} 

class BetaA : BetaBase 
{ 
    public BetaA(AlphaA rAlpha) : base(rAlpha) {} 

    void DoSomething() 
    { 
     if (MAlpha.PropA) ; 
     if (MAlpha.ProbB) ; //wont compile 
    } 
} 

問題:如何使這項工作,而無需創建Alpha的第二個變量..如何訪問多態性方法沒有投在C#

BetaBase將使用MAlpha等會BetaB ..怎麼辦我沒有演員,沒有2個參考變量,實現這個目標?

感謝

+0

我不認爲這是可能的。 – 2011-05-24 00:25:00

+0

簡答:你不能。 – 2011-05-24 00:25:19

+0

爲什麼你不能使用演員?無法從基本類型調用PropB,因爲基本類型AlphaBase不知道PropB。 – alexD 2011-05-24 00:26:56

回答

5

爲了使您的代碼類型安全的,你可以讓BetaBase通用這樣:

class BetaBase<TAlphaBase> 
    where TAlphaBase : AlphaBase 
{ 
    protected TAlphaBase MAlpha; 
    public BetaBase(TAlphaBase rAlpha) 
    { 
     MAlpha = rAlpha; 
    } 

} 

class BetaA : BetaBase<AlphaA> 
{ 
    public BetaA(AlphaA rAlpha) : base(rAlpha) {} 

    void DoSomething() 
    { 
     if (MAlpha.PropA) ; 
     if (MAlpha.PropB) ; //yay! compiles now 
    } 
} 
+0

完美!根本沒有運行時間開銷? – jaybny 2011-05-24 00:32:34

+0

泛型編譯爲IL,它應該比投射更快,而且根本沒有可感知的性能。 – Juliet 2011-05-24 00:38:23

+0

該死的 - 所以有一個性能打擊?在BetaA內創建第二個參考AlphaA會更快嗎? – jaybny 2011-05-24 00:42:20

1
if(MAlpha is AlphaA) { 
    // You need to use a cast still 
} 

這是不可能訪問一個對象的屬性不進行強制轉換到該對象。如果您只是想知道它是否爲AlphaA的實例,請使用表達式... is AlphaA

0

MAlphaAlphaBase類型,它沒有一個布爾值屬性PropB的。你只能通過轉換來做到這一點。

相關問題