2012-06-14 134 views
0

我有一個類A變得太長了。所以我決定把它的一些功能移到B類。我讓B繼承了A.從父類調用派生類函數的C#繼承

現在A中有函數,它需要B中的函數。我的問題是我應該在類中實例化B類答:我不能在類A構造函數中實例化,因爲B類將調用基類來創建永無止境的循環。

我只希望B類被實例化一次,因爲A類構造函數具有我只想要初始化一次的對象。

我甚至不確定我現在是否有任何意義。

+0

使用Singleton模式:d – Aelios

+6

如果你的基類是依賴於派生,*您這樣做是錯誤* – asawyer

+5

很抱歉,如果我直言不諱地說,但在子類中需要方法的父類只是糟糕的設計。 –

回答

1

首先,它不是最好的做法,當你的班級變得太長時,定義一個新班級。如果所有的功能在邏輯上與同一個對象相關,那麼不管它多長時間,都可以保持它在同一個類中。

如果你希望B只被實例化一次,你應該使它成爲一個靜態類。你可以在這裏找到有關靜態類的更多信息: http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

3

基礎關鍵字可以訪問超(基類):http://msdn.microsoft.com/en-us/library/hfw7t1ce(v=vs.71).aspx

但是: 如果你只關注一類的長度,它可能成爲使用部分類的更好的解決方案(http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.80).aspx)。你可以將你的課堂分成多個文件。顯然你現在正在做的不是繼承的意圖和意義。

+1

部分課程是隱藏氣味並緩解有缺陷設計帶來的痛苦的衆多方法之一。從長遠來看,瞭解面向對象的原則將是更好的解決方案。 –

1

如果你在A(這將必須使A摘要)功能抽象,那麼就像你通常那樣從A的方法調用這些方法。然後用您想要的邏輯覆蓋B中的抽象函數。當用戶實例化B類時,即使持有實例的變量的編譯時類型爲A,這些調用也會轉換爲B中的調用。

1

如果存在真正的「is-a」關係,則應該只使用繼承。對我而言,這聽起來像是你描述了B類所需要的功能。也許B「具有-A」這麼說你也應該考慮組成,而不是繼承:

public class B 
{ 
    private A a; 

    public B(A a) 
    { 
     this.a = a; 
    } 

    public void UseAFunction() 
    { 
     a.MyFunction(); 
    } 
}