2014-02-09 55 views
3

我的問題是如果我在Class A中沒有默認構造函數(它是基類,並且具有其他類2或3個非默認構造函數),我如何運行Class B中的非默認構造函數,該構造函數源自Class A爲什麼默認C#類(由Microsoft編寫)不遵循與編碼器編寫的類相同的C#規則

但我已經看到這不適用於默認的C#類,我正在使用asp.net mvc中的值提供程序,並且遇到了一個名爲FormValueProvider的類,它從它的基類NameValueCollectionValueProvider派生。

FormValueProvider只有一個構造函數,它具有ControllerContext類型的參數。 而且它的基類NameValueCollectionValueProvider有兩個構造一個分別NameValueCollection類型和CultureInfo的兩個參數和其他一個有三個參數其中兩個是NameValueCollection類型,第三是輸入CultureInfo.

我如何可以實例FormValueProvider類它是唯一的參數化構造函數 NameValueCollectionValueProvider沒有默認構造函數。爲什麼這個規則適用於編寫他自己的代碼的程序員,而這些代碼不適用於Microsoft編寫的默認C#類。

+1

確定嗎?你知道你可以從派生類的任何構造函數調用基類的任何構造函數嗎?最有可能的是派生類的構造函數只是這樣做的 - 鏈接構建調用 – Charleh

+0

MVC是開源的,所以我建議你看看它在做什麼。你的描述並沒有表明它做了什麼特別的事情,它要麼使用默認屬性來調用它的基類構造函數,要麼從'ControllerContext'中調用它的基類構造函數,或者調用一個內部構造函數,這些構造函數在程序集外部不可見。 – Lee

+0

對默認構造函數沒有要求。我很少有服務類的默認構造函數。 – user2864740

回答

1

這些類完全可能使用internal構造函數。例如:

public class BaseClass 
{ 
    internal BaseClass() {} 

    protected BaseClass(String myString) 
    { 
     /* do some stuff */ 
    } 
} 

public class ChildClass 
{ 
    public ChildClass() 
     : base() 
    { 
     /* do some stuff */ 
    } 
} 

如果構造爲internal,那就只能是可見的是同一個命名空間(如它的子類)中的對象。除非您從.NET庫中反編譯代碼,否則作爲開發人員,您永遠無法看到它。

4

因爲他們分別使用thisbase來稱呼它們。

例如,此構造上FormvalueProvider調用另一個構造函數FormValueProvider

public FormValueProvider(ControllerContext controllerContext) 
      : this(controllerContext, 
      new UnvalidatedRequestValuesWrapper(controllerContext.HttpContext.Request.Unvalidated())) 

然後一個呼籲NameValueCollectionValueProvider構造:

internal FormValueProvider(ControllerContext controllerContext, IUnvalidatedRequestValues unvalidatedValues) 
      : base(controllerContext.HttpContext.Request.Form, 
        unvalidatedValues.Form, 
        CultureInfo.CurrentCulture) 

注意,第二個構造函數是internal ..這意味着您將無法調用特定的過載。這裏發生的是,他們爲特定的重載提供默認值,這意味着您不必指定它們以使其到達目的地。

base關鍵字的文檔是在這裏:http://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx

+0

我知道基地和這個關鍵字,我們如何在編碼中使用它們,但每個在這裏回答的人都說,除非反編譯程序集,否則所有這些都是不可見的。所以這就是我的困惑。但是,仍然感謝您在此論壇上提供的信息。 – user2913184

+0

不用擔心。它的確如此,它看起來有點像外面的巫術。它從來沒有傷害挖掘一點雖然:) –

3

有在C#中沒有這樣的規定,你可以從一個非默認構造函數的基類繼承。爲了派生類的工作,其構造函數必須使用關鍵字base調用基類構造函數。

所以,你可以實現一個類層次結構是這樣的:

class Employee { 
    public Employee(string title) {} 
} 

class Manager: Employee { 
    public Manager() : base("Manager") {} 
} 

所以Manager可以從Employee繼承並有不同的構造 - 只要Manager呼籲Employee類的有效構造。

+0

我知道,哥們,但如果你真的試圖理解我說的話。當我去看派生類的定義和它的基類sp時,我無法在派生類中看到類似base :()的東西。 – user2913184