После того, как я выдернул волосы за этот разгром Я надеялся, что эксперт скажет мне, если это правильно.
У меня есть эти классы:
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 будет гарантированно всегда запускать "новый" метод или потерпит неудачу?