2011-08-18 109 views
3
class Parent 
{ 
    public int GetNo() 
    { 
     return 1; 
    } 
} 

class Child : Parent 
{   
    public Child() 
    { 

    } 

    public int GetNo() 
    {      
     return 2; 
    } 
} 

Parent p = new Child(); 
p.GetNo(); 

但它調用Base.GetNo()。我知道如果我在基地使用virutal它會打電話Child.GetNo() 但我不能在基地使用virutal因爲我必須派生我的類從基地已經分佈在DLL.So沒有辦法我可以修改現有的基地功能類。如何使用基類對象調用派生函數

任何建議都是有價值的。 感謝

+0

您是否有更多關於您想要使用它的上下文的信息?既然基類方法不是被覆蓋的,也許最好是由組合而不是由inheritancs來解決它? – harri

回答

6

你可以將它轉換:

((Child)p).GetNo(); 

if(p is Child) 
    (p as Child).GetNo(); 
+3

+1,儘管當代碼不處理結果爲null時,我不喜歡使用'as'強制轉換。 –

0

你可以有明確的轉換例如強制此

((Child)p).GetNo(); 

或者您可以使用隱藏

public new int GetNo() 
{ 
    return 2; 
} 

雖然我認爲只有在隱藏方法的類中輸入變量時纔會調用後者。

如果你確實需要正確地重寫一個方法,並且它來自編譯的DLL,那麼考慮與開發人員聯繫以確定他們是否可以使該方法變爲虛擬(如果不是原因),或者如果開源項目只是獲得源代碼並自行修改。

+1

如果你通過'new'隱藏它''會得到同樣的結果''p.GetNo();'「將返回父代碼而不是子代。 –

+0

@Jalal這就是我說的 - *我認爲只有在隱藏方法*的類中輸入變量時纔會調用後者。我包括隱藏答案的完整性 – RobV

0

如果沒有在該方法上聲明的virtual,則總是會調用基方法,因爲您將變量聲明爲Parent。如果不能追加virtual基類,那麼你只能要麼變量聲明爲Child,或者將它轉換爲Child,並致電GetNo方法:

Child p = new Child(); 
p.GetNo(); 

或者:

Parent p = new Child(); 
((Child)p).GetNo(); 
0

我剛剛來到這裏,所以我可以找到一個解決方案,不使用演員,但因爲我沒有找到它在這裏是一個。

也許它可以幫助某人。

abstract class Parent 
{ 
    public int GetNo() 
    { 
     return GetNoImpl(); 
    } 

    protected abstract int GetNoImpl(); 

} 

class Child : Parent 
{   
    public Child() 
    { 

    } 

    protected override int GetNoImpl(); 
    {      
     return 2; 
    } 
} 

Parent p = new Child(); 
p.GetNo(); 

注:父類是抽象的。

相關問題