2017-04-24 34 views
0
public class ParentBaseClass 
{ 
    public ParentBaseClass() 
    { 
     // Parameter less constructor 
    } 
    public ParentBaseClass(string type) 
    { 
     // single parameter constructor 
    } 
    public ParentBaseClass(Entity model) 
    { 
     // entity type constructor 
    } 
    public ParentBaseClass(string type, bool IsNewEntity) 
    { 
     // two parameter constructor 
    } 
    public ParentBaseClass(string type, bool IsNewEntity, Entity model) 
    { 
     // three parameter constructor 
    } 
} 

public class ChildClassFirst : ParentBaseClass 
{ 
    public ChildClassFirst() : base("Customer", false) 
    { 
     // implementation of 4th constructor having string, bool parameters. 
    } 
} 

在子類中我只實現了一個具有兩個參數的父類的構造函數。爲什麼沒有必要實現其他構造函數?任何人都可以解釋我?請考慮其他構造函數可能有MVC Model類或其他實體類的dbContext。具有多於一個參數化構造函數的抽象類和帶參數化構造函數的派生類

+1

只要任何基類構造函數(包括自動生成的默認構造函數,如果適用)將由基類隱式或顯式調用,則不需要其他構造函數調用。 –

+0

Thanks @MatthewWatson –

+0

對我的聲明的更正:將「由基類調用」更改爲「由派生類調用」。 (但我想你明白了我的意思) –

回答

0

每個子類調用它的基類構造函數,如果有一個無參數構造函數,並且我們還沒有在其中實現任何基於參數的構造函數,那麼會自動調用無參數,但是就像在你的情況下一樣當ChildClassFirst被實例化時使用哪個構造函數,所以現在調用代碼只能訪問這個無參數構造函數來實例化ChildClassFirst的對象,該對象反過來將使用基於參數的構造函數實例化父類對象,該構造函數使用base()來調用。

簡而言之,Child類只需要指定一個在子類的實例化過程中將要調用的基類構造,並且當沒有指定時,缺省值將是無參數構造函數,它將被調用,但記住參數如果我們沒有在類中指定參數化構造函數,則僅存在。

+0

謝謝@Ehsan Sajjad –

0

抽象類是爲其他類的繼承而設計的,通常不止一個類。不同的派生類可能需要以稍微不同的方式構建其抽象基類。因此,抽象類可以爲不同的派生類提供不同的構造函數。

另一方面,非抽象派生類被設計爲由類用戶實例化。用戶構建需求可能與類本身的需求完全不同,所以派生類提供了自己的構造函數。

因此,這兩組構造函數是完全獨立的:它們服務於不同的需求。派生類可以提供更多或更少的構造函數,其構造函數的簽名可能相似或完全不同。代碼中就是這樣的情況:ChildClassFirst提供了無參數的構造函數,而其抽象基類提供了兩個具有不同參數集的構造函數。只要您在派生類中提供了任何構造函數,C#編譯器就可以處理您的代碼。

+0

謝謝@dasblinkenlight –

相關問題