2010-07-13 290 views

回答

16

如果你在談論泛型約束,是:

class SomeContainer<T> where T : new() { 
    ... 
} 

如果你在談論繼承。不可能要求每個實現接口或繼承基類的類都有一個無參數的構造函數。

你能做的最好是在你的基地構造函數拋出一個異常(在運行時)使用反射,這樣的:

abstract class MyBase { 
    protected MyBase() { 
     if (GetType().GetConstructor(Type.EmptyTypes) == null) 
      throw new InvalidProgramException(); 
    } 
} 

如果你談論的是一個類,是的;只要放一個。

1

這取決於你的意思。例如,您可以約束類或方法中的泛型類型參數,使其具有無關參數的構造函數,其關鍵字爲new,但是除此之外,沒有真正的限制實際類定義的方法。

public void DoSomething<T>() where T : new() { } 
1

作爲官方MSDN文檔中所提到的,C#編譯器自動地生成參數的構造函數,它初始化所有成員變量的缺省值。如果你想執行自己的實現,你可以簡單地這樣做:

類BaseClass的 { 的BaseClass(){//參數的構造函數的執行}}

如果你指的是通用的限制,然後參考SLaks的帖子。

參考

http://msdn.microsoft.com/en-us/library/ace5hbzh.aspx

+2

此外,您可以強制類不利用私有訪問修飾符有一個參數的構造函數。 – 2010-07-13 02:35:40

+1

只要至少有一個基礎構造函數是public或protected(或者如果子類在同一個程序集中),子類仍然可以有無參數的構造函數,即使基類構造函數是私有的。 – 2010-07-13 02:38:16

+0

@Postman:它會限制子始終提供一定的參數給基類的構造,但是這是從「行不通」相去甚遠。 – 2010-07-13 02:39:24

0

我遇到這樣的問題很多次,我認爲有抽象/接口構造的要求。麻煩的是當你使用Activator.CreateInstance或其他技術來實例化一個你可能不會實現的類型(很常見的IoC)。如果您可以強制開發人員使用正確的參數來實現構造函數,生活將會變得更加簡單 - 即使目的僅僅是將參數傳遞給基礎構造函數。

new()約束從2.0開始就幫助解決了這個問題,但是在使用不使用泛型時仍然不能解決問題,或者如果您確實需要特定參數(並且不想混淆尷尬ConstructorInfo,它不能被靜態檢查。)

2

泛型可以強制執行這一點,但我們並不總是使用泛型,P

如果您正在使用單元測試,你可以使用反射來找到所有符合模式的類型,您有參數構造函數(例如,一切從MyBaseObject衍生,或一切都在Foo.Bar命名空間),並驗證方式(由找到參數構造)。

如果你想在運行時斷言這也(也許在#DEBUG),像靜態構造函數是有用的點注入額外類型的檢查。