2011-07-09 16 views
2

我想隱藏繼承類的事件,但不通過EditorBrowserable屬性。 我有一個DelayedFileSystemWatcher它繼承自FileSystemWatcher我需要隱藏更改,創建,刪除和重命名的事件,並使它們是私人的。 我想這一點,但它不工作:事件隱藏在繼承類不工作

/// <summary> 
    /// Do not use 
    /// </summary> 
    private new event FileSystemEventHandler Changed; 

的XML註釋不會在智能感知顯示(原信息顯示)。但是,如果我將訪問修飾符更改爲public,則XML註釋將顯示在IntelliSense中。

任何幫助是受歡迎的。

+0

沒有它似乎改變的是別的東西,以及...爲什麼不更改事件名稱並檢查? – mqpasta

+0

好吧,因爲 - 如果你將事件聲明爲「private」 - 無論如何,原始事件似乎都顯示在IntelliSense中(根據你的評論判斷原始信息顯示出來),而是至少聲明你的新事件爲public,得到正確的智能感知信息似乎有利於宣佈他們'私人'...? – stakx

+0

看來這是一個情況,其中組合(has-a)會更好,而不是繼承(除非需要將類的實例傳遞給接受'FileSystemWatcher'作爲參數的函數) – Cameron

回答

3

你不想使用它,但它平凡解決您的問題:

class MyWatcher : FileSystemWatcher { 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    private new event FileSystemEventHandler Changed; 
    // etc.. 
} 

,你唯一可以做的另一件事是將其封裝。這是可行的,類只是沒有那麼多會員,你是消除其中幾個:

class MyWatcher : Component { 
    private FileSystemWatcher watcher = new FileSystemWatcher(); 
    public MyWatcher() { 
     watcher.EnableRaisingEvents = true; 
     watcher.Changed += new FileSystemEventHandler(watcher_Changed); 
     // etc.. 
    } 
    public string Path { 
     get { return watcher.Path; } 
     set { watcher.Path = value; } 
    } 
    // etc.. 
} 
2

如果你繼承它,你必須提供它。

的可能,而不是繼承:

Public Class DelayedFileSystemWatcher : Component 
{ 
    private FileSystemWatcher myFSW; 

    public DelayedFileSystemWatcher 
    { 
    myFSW = new FileSystemWatcher(); 
    } 
} 
+0

這也是我的方法。如果您需要隱藏基類中的成員,則不應該使用繼承。 –

0

你不能做的東西的公共基類爲民營派生類。如果沒有別的,可以將派生類轉換爲基類並使用公共版本。

隱藏基類的事件的方式實際上可行,但只能從新事件可見的位置,即從派生類內部看到。從外部看,新事件不可見,所以訪問基類。