0

我有这门课,我想理解:

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 类中的 Album 和使用 Collection 的 Album 类有点困惑。

有人可以告诉我使用这个集合的例子吗?
谢谢你!

4

2 回答 2

1

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

Track是 a class,因此它具有引用类型语义。这意味着,您可以Album在之前、之后、任何时候分配给它的属性——这并不重要,因为它存在于托管堆上,其他一切都只是对它的引用。

您所展示的是一个常见的习惯用法 - 您将 the 添加Track到 an Album(这是 a Collectionof Tracks),然后设置一个“反向引用”:您将Track'Album属性设置为Album您刚刚添加的属性。

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

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

你告诉我——这取决于你打算如何使用代码。您展示的是一个简单的强类型集合,它管理您添加到该集合的项目的“容器引用”。例如,它是整个Windows.Forms代码中使用的一种通用格式。

于 2013-10-09T08:11:18.650 回答
0

你有这个方法覆盖:

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

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

目前尚不清楚您要问什么,但假设您这样做了:

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

这不是一个好主意,因为现在该方法会无限递归地调用自身。所以这不是一个选择。

假设您这样做了:

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

现在,该方法唯一要做的就是将. 底层集合中实际上没有插入任何内容。这可能不是你想要的。InsertItemAlbumitem


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

于 2013-10-09T08:39:46.000 回答