当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中覆盖List <T>的Add方法?

如何解决《如何在C#中覆盖List<T>的Add方法?》经验,为你挑选了6个好方法。

我目前正在寻找自己的集合,这就像一个常规列表,除了它只能容纳10个项目.如果在列表中已有10个项目时添加了项目,则在添加新项目之前将删除第一个项目.

我想要做的是创建一个扩展的类,System.Collections.Generic.List然后修改Add(T item)方法以包含在必要时删除第一个项目的功能.



1> Quintin Robi..:

您还可以通过实现add方法

public new void Add(...)

在派生类中隐藏现有的添加并引入您的功能.

编辑:粗略轮廓......

class MyHappyList : List
{
    public new void Add(T item)
    {
        if (Count > 9)
        {
            Remove(this[0]);
        }

        base.Add(item);
    }
}

只是一个注释,认为它是隐含的,但您必须始终按实际类型引用您的自定义列表,而不是基本类型/接口,因为隐藏方法仅适用于您的类型和其他派生类型.



2> Randolpho..:

首先,您不能覆盖Add并且仍然具有针对List的多态性,这意味着如果您使用new关键字并且您的类被强制转换为List,则不会调用您的新Add方法.

其次,我建议您查看Queue类,因为您要做的更多的是队列而不是列表.该类针对您想要做的事情进行了优化,但没有任何类型的大小限制器.

如果你真的希望某些东西像List一样工作但是像一个最大大小的队列那样工作,我建议你实现IList并保留一个Queue实例来存储你的元素.

例如:

public class LimitedQueue : IList
{
  public int MaxSize {get; set;}
  private Queue Items = new Queue();
  public void Add(T item)
  {
    Items.Enqueue(item);
    if(Items.Count == MaxSize)
    {
       Items.Dequeue();
    }
  }
  // I'll let you do the rest
}


"就像一个常规列表,除了它只能容纳10个项目"听起来更像是一个循环缓冲区而不是一个队列给我.看我的回答.

3> Hans Passant..:

您不能覆盖Add(),它不是虚方法.改为从IList派生并使用私有Queue成员进行实现.



4> Lee..:

您可以扩展System.Collections.ObjectModel.Collection并覆盖InsertItem方法以获得所需的行为,并且它还实现了IList



5> Ryan Emerle..:

您可以编写一个实现IList包含内部的类List并编写自己的方法.



6> shinyhappyda..:

看起来我能做的最好的就是:

class MostRecentList : System.Collections.Generic.List {
        private int capacity;

        public MostRecentList(int capacity) : base() {
            this.capacity = capacity;
        }

        public new void Add(T item) {
            if (base.Count == capacity) {
                base.RemoveAt(0);
            }
            base.Add(item);
        }
}

由于该add()方法未标记为虚拟.


这是一个非常糟糕的主意,根据用于发送Add消息的变量的类型,您的类不再正常运行.*真的*你需要阅读LSP及其描述的可替代性
请记住,如果您使用此方法,则如果将其强制转换为List,则该类将无法工作.您的新Add方法永远不会被调用.你真的应该考虑使用队列.
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有