2011-07-09 19 views
2

継承されたクラスからイベントを非表示にしようとしていますが、EditorBrowserable属性では表示されません。 DelayedFileSystemWatcherFileSystemWatcherから継承しています。変更、作成、削除、名前変更イベントを非表示にして非公開にする必要があります。継承されたクラスでイベントが非表示になる

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

XMLコメントは、(元の情報が示されている)のIntelliSenseに表示されていません。 私はこれを試してみましたが、それは動作しません。ただし、アクセス修飾子をpublicに変更すると、IntelliSenseにXMLコメントが表示されます。

助けを歓迎します。

+0

...変更が同様に何か他のものであることを思えません。なんとかなる、クラスだけ多くのメンバーとあなたがそれらのいくつかを排除しているが、その必要はありません。チェック? – mqpasta

+0

さて、もしあなたがイベント 'private'を宣言すれば、オリジナルのイベントはIntelliSenseに表示されているようです(あなたのコメントから元の情報が表示されていると判断して)適切なIntelliSense情報を得ることは、それらを「私的に」宣言することに有益だと思われます...? – stakx

+0

これは、(FileSystemWatcherを引数として受け入れる関数にクラスのインスタンスを渡す必要がない限り)コンポジション(has-a)が継承の代わりに優れている場合です。 – 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

あなたは派生クラスでプライベートに、基本クラスでパブリック何かをすることはできません。それ以外の場合は、派生クラスを基本クラスにキャストし、パブリック・バージョンを使用することができます。

基本クラスのイベントを非表示にする方法は実際には動作しますが、新しいイベントが表示される場所、つまり派生クラスの内部からのみ発生します。外部からは、新しいイベントは表示されないので、基本クラスにアクセスします。

関連する問題