2012-08-07 32 views
1

我知道抽象類中的構造函數應該在C#中受到保護。我是否需要爲抽象類提供一個空的受保護構造函數?

但有些抽象類不需要的非參數構造函數。例如:

public abstract MyAbstractClass { 
    public abstract Method1(); 
    public abstract Method2(); 
    // non-parameterless constructors are not needed 
} 

我的問題是,在上面的類,做我需要提供一個空的受保護的構造覆蓋默認的隱式構造函數?那就是:

public abstract MyAbstractClass { 
    protected MyAbstractClass() { } 

    public abstract Method1(); 
    public abstract Method2(); 
} 

如果我不提供這個空受保護的構造,就會有一個隱含的默認構造函數,這是公開的(正確嗎?)。這打破了「抽象類中的構造函數不應該公開」的規則。

但是當我檢查ASP.NET MVC框架的源代碼,我看到他們沒有爲抽象類提供空的受保護的構造。所以,也許是設計規則應該是:

如果定義在抽象類的構造函數,他們不應該是公開的。

如果在抽象類中不需要非無參數構造函數,只是不要定義它們。

有什麼想法?

+0

C#中沒有隱式的構造函數,我相信。所有參與變量初始化爲空值C++ – 2012-08-07 03:16:43

+0

如果您沒有定義任何構造函數,那麼將會有一個默認構造函數。 – 2012-08-07 03:37:01

回答

6

不,你並不需要聲明一個受保護的默認構造函數。如果您的抽象類的構造函數中沒有任何要做的事情,請不要聲明它。如果您確實需要做什麼,將其標記爲受保護的將與將其標記爲公共相同,因爲基礎構造函數只能由子級調用,並且子級無論如何都會受到保護。

+0

我認爲這不能回答這個問題。如果公共建設者被定義在抽象類中,他們也只能由子類來調用。如果我在抽象類中定義公共構造函數,則沒有編譯器錯誤。 – 2012-08-07 03:09:59

+0

我編輯它給更深入的解釋。 – Dan 2012-08-07 03:15:50

相關問題