Правильный способ наследовать несколько интерфейсов с одинаковыми методами, но разными сигнатурами? - PullRequest
0 голосов
/ 26 января 2011

После того, как я выдернул волосы за этот разгром Я надеялся, что эксперт скажет мне, если это правильно.

У меня есть эти классы:

public class ParentAwareHashset<TObject, TParent> : 
        ParentAwareCollection<TObject,TParent, HashSet<TObject>>,
        ICollection<TObject>, ISet<TObject>  
        where TObject : IParentProvider<TParent>

public abstract class ParentAwareCollection<TObject, TParent, TInnerList> :
ICollection<TObject>,  IParentProvider<TParent>
        where TObject : IParentProvider<TParent>
        where TInnerList : ICollection<TObject>, new()

Базовый класс реализует void Add для ICollection<T>. В моем унаследованном классе я столкнулся с проблемой, реализовав public new bool Add(TObject item), который является единственным способом реализации метода bool Add ISet, поскольку сигнатура не соответствует базовому методу void Add. Итак, что случилось, я случайно сделал что-то с этим методом, который имел реализацию только для ICollection, использовался метод базового класса Add.

Думаю, я понял, как сделать это правильно ... но я все еще не уверен, что избежу неожиданного поведения, поэтому надеялся, что какой-нибудь гуру сможет подтвердить или опровергнуть этот подход.

    bool ISet<TObject>.Add(TObject item) 
    {
        return(Add(item));
    }
    void ICollection<TObject>.Add(TObject item)
    {  
        throw new Exception(@"You probably didn't mean for this to happen, you're
          using a method that doesn't have an ISet implementation.");
    }
    public new virtual bool Add(TObject item)
    {
        // my actual add code
    }

Может кто-нибудь сказать мне, если объект типа ParentAwareHashset будет гарантированно всегда запускать "новый" метод или потерпит неудачу?

1 Ответ

0 голосов
/ 26 января 2011

Просто пусть явно реализованные методы интерфейса вызывают правильный метод, а не выдают исключение:

bool ISet<TObject>.Add(TObject item) 
{
    return(Add(item));
}
void ICollection<TObject>.Add(TObject item)
{  
    **return(Add(item))**;
}
public new virtual bool Add(TObject item)
{
    // my actual add code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...