2016-06-02 2 views
0

В настоящее время я пытаюсь переопределить функцию Remove для общего класса List-Class. Но я борюсь с одной крошечной частью моего подхода - со ссылкой на объект за пределами метода 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: Это класс, в котором я хочу, чтобы вызвать метод 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

вы не можете переопределить любой член 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 
    } 
} 

Thuse вы won't даже нужно наследование List<T> но использовать compoisition, который дает вам гораздо большую гибкость, что вы предлагаете к пользователя вашего класса. С вашей текущей реализацией пользователь может сделать все с помощью списка, что он мог бы сделать с общей реализацией List. Однако в большинстве случаев вы просто заинтересованы в предоставлении нескольких методов вместо всех. Таким образом, вы можете скрыть все, что вы не получите снаружи, создав совершенно новый класс, который вместо используетList<T>.

+0

Привет, спасибо за ваш ответ, это прежде всего то, что я хотел архивировать. Но, как вы видите, мне нужно вызвать Dispose-Method на ссылочном объекте. Но с вашим решением его невозможно. Как мне изменить код для его архивации? – Snickbrack

+0

Уверенный, просто назовите 'obj.Dispose' внутри метода. Удаление из списка не влияет на состояние ваших экземпляров каким-либо образом, чтобы вы могли легко получить доступ и распорядиться им. – HimBromBeere

+0

Я пробовал это, но получаю сообщение об ошибке, говорящее, что функция Dispose недоступна. Но в этом классе есть один. Я обновил код в вопросе ... – Snickbrack

Смежные вопросы