Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的私有继承?_C#_Inheritance_Queue - Fatal编程技术网

C#中的私有继承?

C#中的私有继承?,c#,inheritance,queue,C#,Inheritance,Queue,我是C#新手,想知道C#中是否有类似私有继承的东西(比如C++) 我的问题如下: 我想通过以下更改实现一个队列(称为SpecialQueue): 队列中可以存储的项目的最大数量 如果队列已满,并且您插入了一个新项目,则一个项目将自动弹出队列(队列中的第一个项目),新项目将插入到队列的末尾 queue提供的某些方法(如peek())不应向SpecialQueue的用户公开 在C++中,我将从队列中私有化,只公开我想要的方法,并将其他方法改为我的意愿。但不幸的是,队列中的所有方法都没有“Overri

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

我的问题如下: 我想通过以下更改实现一个队列(称为SpecialQueue):

  • 队列中可以存储的项目的最大数量
  • 如果队列已满,并且您插入了一个新项目,则一个项目将自动弹出队列(队列中的第一个项目),新项目将插入到队列的末尾
  • queue提供的某些方法(如peek())不应向SpecialQueue的用户公开
  • 在C++中,我将从队列中私有化,只公开我想要的方法,并将其他方法改为我的意愿。但不幸的是,队列中的所有方法都没有“Override”修饰符,我不知道如何在C#中实现这一点

    有什么帮助吗

    问候,,
    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
    }