2010-12-23 115 views
8

我是C#的新手,想知道在C#中是否有類似於私有繼承的東西(比如在C++中)?C#中的私有繼承?

我的問題是: 我想實現一個隊列(命名爲SpecialQueue)有以下變化:

  1. 隊列中有可以存儲在它的項目的最大數量。
  2. 如果隊列已滿並插入新項目,則會自動將一個項目從隊列中移出(隊列中的第一個項目),並將新項目插入到隊列的末尾。
  3. 隊列提供的某些方法(如peek())不應暴露給SpecialQueue的用戶。

在C++中,我會從隊列中私有ihnerit,只公開我想要的方法並將其他人改變爲我的意願。但不幸的是,隊列中的所有方法都沒有「Override」修飾符,我不知道如何在C#中實現這一點。

任何幫助?

問候, 丹

+0

我想知道這個override修飾符是當同時覆蓋虛擬,我們使用簡單的`在C#或`override`修改C#virtual`修改方法? – Tarik 2011-10-27 16:57:23

回答

15

使用組成:包括通常Queue的領域在SpecialQueue。私人繼承實際上與組成非常相似。

請參閱http://www.parashift.com/c++-faq-lite/private-inheritance.html#faq-24.3討論。


實現可能是類似的東西:

public class SpecialQueue<T> 
{ 
    private int capacity; 
    private Queue<T> storage; 

    public SpecialQueue(int capacity) 
    { 
     this.capacity = capacity; 
     storage = new Queue<T>(); 
     // if (capacity <= 0) throw something 
    } 

    public void Push(T value) 
    { 
     if (storage.Count == capacity) 
      storage.Dequeue(); 
     storage.Enqueue(value); 
    } 

    public T Pop() 
    { 
     if (storage.Count == 0) 
      throw new SomeException("Queue is empty"); 
     return storage.Dequeue(); 
    } 

    public int Count 
    { 
     get { return storage.Count; } 
    } 
} 

您需要添加更多的功能/界面,如果你想SpecialQueue支持他們。然而,我不會推薦執行IEnumerable,因爲這會允許Peek(您要禁止)。

+2

+1即使C#*擁有私有繼承,這仍然是正確的答案。 :-)太棒了。 – 2010-12-23 17:20:43

+0

雖然你通過使用這種方法錯過了Linq。這可能不是必要的,但可能是一個煩惱,因爲這個類與Queue類似於 – RichK 2010-12-23 20:45:03

4

您可以實現相同的接口爲Queue(或Queue<T>),有一個Queue作爲後盾場和揭露那些你需要的方法,這將只是換到支持字段的電話。

例如(一直保持執行的ICollectionQueue<T>線)

public class SpecialQueue<T> : IEnumerable<T>, ICollection 
{ 
    private readonly Queue<T> _queue; 

    #region Constructors 

    public SpecialQueue() 
    { 
     _queue = new Queue<T>(); 
    } 

    public SpecialQueue(int capacity) 
    { 
     _queue = new Queue<T>(capacity); 
    } 

    public SpecialQueue(IEnumerable<T> collection) 
    { 
     _queue = new Queue<T>(collection); 
    } 

    #endregion 

    #region Methods 

    // implement any methods that you want public here... 

    #endregion 

    #region Interface Implementations 

    public IEnumerator<T> GetEnumerator() 
    { 
     return _queue.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return _queue.GetEnumerator(); 
    } 

    public void CopyTo(Array array, int index) 
    { 
     ((ICollection) _queue).CopyTo(array, index); 
    } 

    public int Count 
    { 
     get { return _queue.Count; } 
    } 

    public object SyncRoot 
    { 
     get { return ((ICollection) _queue).SyncRoot; } 
    } 

    public bool IsSynchronized 
    { 
     get { return ((ICollection) _queue).IsSynchronized; } 
    } 

    #endregion 
}