2011-01-26 30 views
0

将我的头发拉出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 AddICollection<T>。在我的继承类中,由于签名与基本的void Add方法不匹配,我实施了public new bool Add(TObject item),这是实现bool Add ISet方法的唯一方法。所以发生了什么事情,我碰巧用一个只有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类型的对象将被保证总是运行“新”方法,或失败?

回答

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 
} 
+0

这是有道理的。我担心没有处理添加的返回值的后果。但我想,如果我使用的是ICollection方法,那么根据定义,我不在乎返回是什么,只要我自己使用Add的实现。谢谢。 – 2011-01-26 15:31:14

相关问题