2011-11-30 55 views
0

美好的一天,我對經驗豐富的C#程序員有一個相當簡單的問題。基本上,我想有一個抽象基類,它包含一個依賴於子類的值的函數。我嘗試過類似於下面的代碼,但編譯器抱怨SomeFunction()嘗試使用它時SomeVariable爲null。C#函數繼承 - 使用具有基類函數的子類Vars

基類:

public abstract class BaseClass 
{ 
    protected virtual SomeType SomeVariable; 

    public BaseClass() 
    { 
     this.SomeFunction(); 
    } 

    protected void SomeFunction() 
    { 
     //DO SOMETHING WITH SomeVariable 
    } 
} 

子類:

public class ChildClass:BaseClass 
{ 
    protected override SomeType SomeVariable=SomeValue; 
} 

現在我希望,當我做:

ChildClass CC=new ChildClass(); 

ChildClass的一個新實例應和CC將使用SomeValue運行其繼承的SomeFunction。但是,這不是發生了什麼。編譯器抱怨在BaseClass中SomeVariable爲null。我想在C#中做什麼?我已經使用其他託管語言來允許我做這樣的事情,所以我確信我只是在這裏犯了一個簡單的錯誤。

任何幫助非常感謝,謝謝。

回答

1

你猜對了差不多吧,但你需要改用變量屬性:

public abstract class BaseClass { 
    protected SomeType SomeProperty {get; set} 
    public BaseClass() { 
     // You cannot call this.SomeFunction() here: the property is not initialized yet 
    } 
    protected void SomeFunction() { 
     //DO SOMETHING WITH SomeProperty 
    } 
} 
public class ChildClass:BaseClass { 
    public ChildClass() { 
     SomeProperty=SomeValue; 
    } 
} 

因爲SomeProperty沒有被派生類初始化,您不能在構造函數中使用FomeFunction。雖然在構造函數之外它很好。一般來說,在構造函數中訪問虛擬成員應該被認爲是可疑的。

如果您必須將派生類中的值傳遞給基類構造函數,最好通過受保護的構造函數的參數來顯式執行它。

+0

感謝您的快速回復。所以變量和屬性在構造函數被調用時不會被初始化?那我不知道。此外,該屬性及其引用的變量是否也需要虛擬或抽象? 最後,派生類如何從其基類訪問構造函數?當使用base.something時它們不會顯示出來; –

+0

@ SeanO'Connor只有當您希望能夠覆蓋它的實現時,該屬性才需要是虛擬的,這對計算屬性有意義。派生類使用base關鍵字調用基礎構造函數,如下所示:Derived():base(param1,param2){} – dasblinkenlight

+0

啊,我認爲這會清除所有東西。再次感謝您的幫助。 –