C#中的私有继承?
我是C#新手,想知道C#中是否有类似私有继承的东西(比如C++) 我的问题如下: 我想通过以下更改实现一个队列(称为SpecialQueue):C#中的私有继承?,c#,inheritance,queue,C#,Inheritance,Queue,我是C#新手,想知道C#中是否有类似私有继承的东西(比如C++) 我的问题如下: 我想通过以下更改实现一个队列(称为SpecialQueue): 队列中可以存储的项目的最大数量 如果队列已满,并且您插入了一个新项目,则一个项目将自动弹出队列(队列中的第一个项目),新项目将插入到队列的末尾 queue提供的某些方法(如peek())不应向SpecialQueue的用户公开 在C++中,我将从队列中私有化,只公开我想要的方法,并将其他方法改为我的意愿。但不幸的是,队列中的所有方法都没有“Overri
Dan使用组合:在您的
特殊队列中包含一个普通字段。私有继承实际上与组合非常相似
请参阅以进行讨论
实现可以是这样的:
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; }
}
}
公共类特殊队列
{
私人int能力;
专用队列存储;
公共专用队列(整数容量)
{
这个。容量=容量;
存储=新队列();
//如果(capacity您可以实现与队列
(或队列
)相同的接口,将队列
作为备份字段,并公开您需要的方法,这将简单地将调用包装到备份字段
例如(使ICollection
的实现与Queue
保持一致)
公共类特殊队列:IEnumerable,ICollection
{
专用只读队列_队列;
#区域构造函数
公共特殊队列()
{
_队列=新队列();
}
公共专用队列(整数容量)
{
_队列=新队列(容量);
}
公共特殊队列(IEnumerable集合)
{
_队列=新队列(集合);
}
#端区
#区域方法
//在此处实现您想要公开的任何方法。。。
#端区
#区域接口实现
公共IEnumerator GetEnumerator()
{
返回_queue.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
返回_queue.GetEnumerator();
}
public void CopyTo(数组,int索引)
{
((ICollection)_queue).CopyTo(数组,索引);
}
公共整数计数
{
获取{return\u queue.Count;}
}
公共对象同步根
{
获取{return((ICollection)u queue.SyncRoot;}
}
公共布尔值是同步的
{
获取{return((ICollection)\队列).IsSynchronized;}
}
#端区
}
+1即使C#具有私有继承,这仍然是正确的答案。:-)链接也很好。虽然使用这种方法确实会错过Linq。这可能不是必需的,但可能会很麻烦,因为类与Queue@RichK:OP明确要求非常有限的语义:例如,Peek
应该不可用。使用IEnumerable
可以通过轻松获得>FirstOrDefault
。此解决方案可行,但问题是SpecialQueue不是队列,因此我无法保存一个队列数组,因为它的某些元素实际上是SpecialQueue。@George:如果要在使用常规队列的位置使用SpecialQueue
,可以切换到公共继承().但是像Peek
和Enqueue
这样的方法不是虚拟的,所以这是行不通的:-(+1建议SpecialQueue
至少实现一些与Queue
相同的接口,使其有可能被注入到Queue
的位置。我想知道这个覆盖修饰符仅仅是C中的virtual
修饰符,或者在覆盖虚拟队列时使用的override
修饰符C方法?
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
}