我是C#的新手,想知道C#中是否存在类似私有继承的东西(比如C ++)?
我的问题如下: 我想实现一个队列(将其命名为SpecialQueue),并进行以下更改:
在c ++中,我会从队列中私有ihnerit,只公开我想要的方法,并根据我的意愿改变其他方法。但不幸的是,队列中的所有方法都没有“覆盖”修饰符,我不知道如何在C#中实现它。
任何帮助?
此致 丹
答案 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
}