2010-12-23 143 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 
}