2016-06-02 5 views
0

現在、一般的なリストクラスの削除機能をオーバーライドしようとしています。しかし私は、私のアプローチの1つの小さな部分、つまりRemoveメソッドの外のオブジェクトへの参照を苦労しています。オーバーライドリストの削除機能が失敗しました

public new void Remove(ref string item) 
{ 
    if (Count > 9) 
    { 
     Remove(this[0]); 
    } 
    base.Remove(item); 
} 

このメソッドは、実際のRemoveメソッドをオーバーライドしていないため、機能しません。

誰もこれを処理する方法を知っていますか?

EDIT:削除関数では、参照オブジェクトでメソッドを呼び出す必要があります。

EDIT2:私の現在のバージョン

class SocketList<WebSocketConnection> 
{ 
    private List<WebSocketConnection> theList = new List<WebSocketConnection>(); 
    public void Remove(ref WebSocketConnection obj) 
    { 
     obj.Dispose(); 
     theList.Remove(obj); 
     // additional stuff 
    } 
} 

しかし、このバージョンでは、参照されるオブジェクトのDisposeメソッドを呼び出すことはできません。私はこのオブジェクトのために利用可能なメソッドがないというメッセージを受け取りました。

EDIT3:これは私が彼らの非をvirtualあるので、あなたはList<T>の任意のメンバーを上書きcan't Disposeメソッドに

public class WebSocketConnection : IWebSocketConnection 
{ 
    {...} 
    // Flag: Has Dispose already been called? 
    private bool disposed = false; 
    // Instantiate a SafeHandle instance. 
    private SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true); 
    {...} 
    // Public implementation of Dispose pattern callable by consumers. 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
    // Protected implementation of Dispose pattern. 
    protected virtual void Dispose(bool disposing) 
    { 
     if (disposed) 
      return; 
     if (disposing) 
     { 
      handle.Dispose(); 
      // Free any other managed objects here. 
      // 
     } 
     // Free any unmanaged objects here. 
     // 
     disposed = true; 
    } 
} 
+0

あなたが望むのは簡単には不可能です。これを望んでいるあなたの理由は何ですか?好奇心だけですか、解決しようとしている大きな問題がありますか?その大きな問題はより有用な答えを得るかもしれません。 – hvd

+0

本当に 'ref string item'-signatureが必要ですか?あなたのリストにはどのようなタイプの要素が含まれていますか?その中に文字列または複雑なオブジェクトがありますか? – HimBromBeere

+0

代わりにIListの実装を検討しましたか? – user6144226

答えて

3

を呼び出すしたいクラスです。またnewは、が基本実装のを隠すため、これを解決できません。あなたはMyExtList<MyClass> a = new MyExtList<MyClass>()とあなたのリストかもしれません。ただし、このインスタンスをベースクラスにキャストするときは、オーバーライドされたインスタンスの代わりにベース実装も使用されます。あなたもList<T>の継承を必要とするが、あなたがに提供するものではるかに柔軟性を与えるcompoisitionを使用しwon't

class MyExtList<T> 
{ 
    private List<T> theList = new List<T>(); 

    public void Remove(T obj) 
    { 
     theList.Remove(obj) 
     // additional stuff 
    } 
} 

Thuse:あなたはあなたが本当に欲しいものを達成するために次の操作を行うことができますしかし

あなたのクラスのユーザー。現在の実装では、ユーザはジェネリックList実装で何ができるのかをリストですべて行うことができます。しかし、ほとんどの状況では、すべてではなくいくつかの方法を提供することに興味があります。だから、あなたが外側に提供したくないものすべてを隠すことができます。はそれから派生する代わりにList<T>を使用します。

+0

こんにちは、あなたの答えをありがとう、それは主に私がアーカイブしたいものです。しかし、あなたが参照オブジェクトのDisposeメソッドを呼び出す必要があることがわかります。しかし、あなたの解決策では、彼は不可能です。これをアーカイブするにはどのようにコードを変更する必要がありますか? – Snickbrack

+0

もちろん、 'objを呼び出すだけです。メソッド内でDisposeを実行します。リストから削除しても、インスタンスの状態には何ら影響しませんので、簡単にアクセスして破棄することができます。 – HimBromBeere

+0

私はそれを試みましたが、使用可能なDispose関数がないというエラーメッセージが表示されました。しかし、このクラスには1つあります。質問のコードを更新しました... – Snickbrack

関連する問題