System.Collections.ObjectModel Collection <t> </t>

时间:2013-10-09 08:07:11

标签: c# collections

我正在尝试理解这门课程:

public class Track 
{ 
    public string Title { get; set; } 
    public uint Length { get; set; } 
    public Album Album { get; internal set; } 
} 

public class Album : Collection<Track> 
{ 
    protected override void InsertItem(int index, Track item) 
    { 
        base.InsertItem(index, item); 
        item.Album = this; 
    } 

protected override void SetItem(int index, Track item) 
{ 
    base.SetItem(index, item); 
    item.Album = this; 
} 

protected override void RemoveItem(int index) 
{ 
    this[index].Album = null;
   base.RemoveItem(index); 
} 

protected override void ClearItems() 
{ 
    foreach (Track track in this) 
    { 
        track.Album = null; 
    } 
    base.ClearItems(); 
} 
} 

为什么我们在分配后使用base.InsertItem 新变量?可以省略base.InsertItem和其他 (设置,删除,清除项目)。


我想我对自己的问题不够清楚。

base.InsertItem在我看来是Collections方法 将项添加到集合中。所以,如果我们已经 添加了为什么我们将其分配给item.Album。

我对Track中的专辑感到有点困惑 使用Collection的class和Album类。

有人能告诉我使用这个系列的例子吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

  

为什么我们在分配新变量后使用base.InsertItem

Trackclass,因此它具有引用类型语义。这意味着,您可以在之前,之后,之后分配其Album属性 - 它并不重要,因为它存在于托管堆上,而其他所有内容只是对它的引用。

您展示的内容是一个常见的习惯用法 - 您将Track添加到AlbumCollection Tracks},然后设置“后退参考”:您将Track的{​​{1}}属性设置为您刚添加的Album

请注意,他们在调用 Album之后执行有问题的分配,因为这是正确的事件顺序。在添加项目之前,该项目不是集合的一部分。另请注意,InsertItem覆盖以相反的顺序执行。

  

是否可以省略RemoveItem和其他(设置,删除,清除项目)。

您告诉我 - 这取决于您计划如何使用代码。您展示的是一个简单的强类型集合,它管理您添加到该集合的项目的“容器引用”。例如,它是base.InsertItem代码中使用的通用格式。

答案 1 :(得分:0)

你有这个方法覆盖:

protected override void InsertItem(int index, Track item)
{ 
    base.InsertItem(index, item); 
    item.Album = this; 
}

这会更改从基类Collection<Track>继承的the behavior of the InsertItem method。第一行从基类调用实现。所以在那之后,我们做了和基类一样的事情。第二行通过提供对当前集合(Album)的引用来修改要插入的项目。

目前尚不清楚你的要求,但假设你这样做了:

protected override void InsertItem(int index, Track item)
{ 
    InsertItem(index, item);    // bad
    item.Album = this; 
}

这不是一个好主意,因为现在该方法以递归方式调用 ad infinitum 。所以这不是一个选择。

假设您改为:

protected override void InsertItem(int index, Track item)
{ 
    item.Album = this; 
}

现在,InsertItem方法执行的事件是将Album写入item。实际上没有任何东西插入底层集合中。这可能不是你想要的。


那么base关键字是什么?它允许您调用基类的方法(或其他成员),即使该方法被重写为当前类上的隐藏。您的示例给出了base访问权限的典型用法。