覆盖列表删除功能失败

时间:2016-06-02 07:05:56

标签: c# generics

我目前正在尝试覆盖通用List-Class的Remove函数。但我正在努力处理我的方法的一小部分 - 引用Remove-method之外的一个对象。

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

此方法不起作用,因为它不会覆盖实际的Remove-method。

有谁知道如何处理这个问题?

编辑:在remove函数中我想调用引用对象上的方法。

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:这是我想要调用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;
    }
}

1 个答案:

答案 0 :(得分:3)

您无法覆盖List<T>的任何成员,因为它们不是virtual。另外new也不会解决这个问题,因为它只是隐藏基础实现。您的列表可以是MyExtList<MyClass> a = new MyExtList<MyClass>()。但是,每当您将此实例强制转换为其基类时,也会使用基本实现而不是“重写”实例。

但是,您可以执行以下操作来实现您真正想要的目标:

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

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

你甚至不需要List<T>的继承,但是使用一个compoisition,它可以让你更灵活地为你的班级用户提供什么。使用您当前的实现,用户可以使用列表执行所有操作,也可以使用通用List实现。然而,在大多数情况下,您只是想提供一些方法而不是所有方法。因此,您可以通过创建一个使用 List<T>而不是从中派生的全新类来很好地隐藏您不会向外部提供的所有内容。