C#中的私有继承?

时间:2010-12-23 17:14:11

标签: c# inheritance queue

我是C#的新手,想知道C#中是否存在类似私有继承的东西(比如C ++)?

我的问题如下: 我想实现一个队列(将其命名为SpecialQueue),并进行以下更改:

  1. 队列中包含可存储的最大项目数。
  2. 如果队列已满并且您插入了一个新项目,则会自动将一个项目从队列中取出(队列中的第一个项目),新项目将插入到队列的末尾。
  3. 队列提供​​的某些方法(如peek())不应向SpecialQueue的用户公开。
  4. 在c ++中,我会从队列中私有ihnerit,只公开我想要的方法,并根据我的意愿改变其他方法。但不幸的是,队列中的所有方法都没有“覆盖”修饰符,我不知道如何在C#中实现它。

    任何帮助?

    此致 丹

2 个答案:

答案 0 :(得分:15)

使用合成:在SpecialQueue中添加常用的Queue作为字段。私有继承实际上与组合非常相似。

请参阅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(您要禁止)。

答案 1 :(得分:4)

您可以实现与Queue(或Queue<T>)相同的接口,使用Queue作为支持字段并公开您需要的那些方法,这将简单地包装调用支持字段。

例如(已将ICollection的实施与Queue<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
}