2011-01-26 51 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

相關問題