使用相同方法但不同签名继承多个接口的正确方法?

时间:2011-01-26 15:15:41

标签: c# interface

将我的头发拉过this debacle之后,我希望专家可以告诉我这是否正确。

我有这些课程:

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类型的对象是否可以保证始终运行“new”方法,还是失败?

1 个答案:

答案 0 :(得分:0)

只需让显式实现的接口方法调用正确的方法,而不是抛出异常:

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
}