2012-06-01 70 views
11

是否有可能使C#基類只能在編譯到其中的庫程序集中訪問,而使其他從子類繼承的子類公開?C#私有(隱藏)基類

例如:

using System.IO; 

class BaseOutput: Stream   // Hidden base class 
{ 
    protected BaseOutput(Stream o) 
    { ... } 

    ...lots of common methods... 
} 

public class MyOutput: BaseOutput // Public subclass 
{ 
    public BaseOutput(Stream o): 
     base(o) 
    { ... } 

    public override int Write(int b) 
    { ... } 
} 

在這裏,我想對BaseOutput類是無法進入我的圖書館的客戶,但讓子類MyOutput是完全公開的。我知道C#不允許基類具有比子類更多的限制性訪問,但是還有其他一些達到相同效果的合法方式嗎?

UPDATE

我對這個特殊的庫解決方案是讓基類publicabstract,並與記錄它「不要使用這個基類直接」。我還使基類internal的構造函數有效地阻止外部客戶端使用或繼承該類。

(這是一個恥辱,因爲其他的O-O語言讓我有隱藏的基類。)

+0

爲什麼不讓'BaseOutput'的內部構造函數能夠讓外部代碼不能從它繼承? –

+0

@mikez:是的,這就是我所做的,請參閱上面的更新。 –

+0

公共類與內部構造函數可能是一個更好的選擇(在我的答案示例) –

回答

12

遺憾的是沒有。你不能從內部或私人課程派生公共課程。

您需要公開基類,或者需要爲所有類似的類聲明所有方法。如果你走的是你再次聲明所有方法的路線,那麼創建一個輔助類可能很有用,它有它們的實際實現。儘管如此,它還是很有一些樣板的。

+0

太糟糕了。 Java讓我這樣做。 –

+1

爲什麼「不幸」? – stakx

+4

因爲它有時會爲我節省不少樣板。例如,在幾個類中實現相同的接口時。 – CodesInChaos

5

考慮一種模式,例如Facade。這就是他們在那裏。我不認爲你可以通過直接繼承來實現你所需要的。

+0

我不想創建很多轉發方法。隱藏基類背後的要點是避免複製大量(常用的)方法。 –

+1

事實上,無論如何,人們應該贊成合成而不是繼承(http://en.wikipedia。org/wiki/Composition_over_inheritance) – jeroenh

+0

@jeroenh - 這與我的觀點完全相反。我希望基類實現大多數方法和變量,並且我希望每個派生的子類儘可能少地實現*。 –

1

根據什麼「很多常用的方法」正在做的,你可以實現它的一些內部擴展方法:

internal static class MyStreamExtensions 
{ 
    internal static int UsefulOne(this Stream stream) 
    { 
    return 42; 
    } 
} 

另一種方法是使構造函數內部,以防止意外派生從該類:

public class BaseOutput: Stream 
{ 
    internal BaseOutput(Stream o) 
    { ... } 

    ...lots of common methods... 
} 

與層次結構中的「不可見」中間類相比,這將使代碼更容易理解。