相关疑难解决方法(0)

为什么不从List <T>继承?

在规划我的程序时,我经常从一连串的想法开始:

足球队只是一个足球运动员名单.因此,我应该代表它:

var football_team = new List<FootballPlayer>();
Run Code Online (Sandbox Code Playgroud)

此列表的顺序表示球员在名单中列出的顺序.

但我后来才意识到,除了仅仅是球员名单之外,球队还有其他属性,必须记录下来.例如,本赛季的总得分,当前预算,统一颜色,string代表球队名称等等.

那么我认为:

好吧,足球队就像一个球员名单,但另外,它有一个名称(a string)和一个总分(a int)..NET不提供用于存储足球队的类,所以我将创建自己的类.最相似和相关的现有结构是List<FootballPlayer>,所以我将继承它:

class FootballTeam : List<FootballPlayer> 
{ 
    public string TeamName; 
    public int RunningTotal 
}
Run Code Online (Sandbox Code Playgroud)

但事实证明,指南说你不应该继承List<T>.我在两个方面完全被这个指南搞糊涂了.

为什么不?

显然List是以某种方式针对性能进行了优化.怎么会这样?如果我延长会给我带来什么性能问题List?究竟会打破什么?

我看到的另一个原因List是微软提供的,我无法控制它,所以我在以后暴露"公共API"后无法改变它.但我很难理解这一点.什么是公共API,我为什么要关心?如果我当前的项目没有并且不太可能拥有此公共API,我可以放心地忽略此指南吗?如果我继承List 并且事实证明我需要一个公共API,那么我将遇到什么困难?

为什么它甚至重要?列表是一个列表.什么可能改变?我可能想要改变什么?

最后,如果微软不想让我继承List,他们为什么不上课sealed呢?

我还应该使用什么呢?

显然,对于自定义集合,Microsoft提供了一个Collection应该扩展的类而不是List.但这个类是非常裸露,并没有多少有用的东西,比如AddRange,例如.jvitor83的答案提供了该特定方法的性能原理,但是如何缓慢AddRange而不是没有AddRange

继承Collection是比继承更多的工作List,我认为没有任何好处.当然微软不会告诉我无缘无故地做额外的工作,所以我不禁觉得我在某种程度上误解了某些东西,而继承Collection实际上并不是解决我问题的正确方法.

我见过如实施的建议IList …

.net c# oop inheritance list

1299
推荐指数
22
解决办法
17万
查看次数

为什么我不能从扩展类型的基类调用扩展方法?

我正在尝试List<KeyValuePair<string,int>>通过覆盖索引器来添加查找元素的功能.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    public class MyList : List<KeyValuePair<string, int>>
    {
        public int this[string key]
        {
            get
            {
                return base.Single(item => item.Key == key).Value;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,编译器抛出此错误:

' System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string,int>>'不包含' Single' 的定义.

虽然List<T>没有那个方法,但它应该是可见的,因为它是来自System.Linq命名空间的扩展方法(包括在内).显然使用this.Single解决问题,但为什么通过base错误访问?

C#规范第7.6.8节说

base.I发生在类或结构中时,I必须表示该类或结构的基类的成员.

这似乎阻止了对扩展方法的访问base.不过它也说

在绑定时,表单的基本访问表达式base.Ibase[E]它们的编写方式完全相同,((B)this).I并且((B)this)[E]在哪里B是构造发生的类或结构的基类.因此,base.Ibase[E]对应于 …

c# linq inheritance extension-methods

17
推荐指数
1
解决办法
5723
查看次数

标签 统计

c# ×2

inheritance ×2

.net ×1

extension-methods ×1

linq ×1

list ×1

oop ×1