我正在尝试理解这门课程:
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类。
有人能告诉我使用这个系列的例子吗? 谢谢!
答案 0 :(得分:1)
为什么我们在分配新变量后使用
base.InsertItem
?
Track
是class
,因此它具有引用类型语义。这意味着,您可以在之前,之后,之后分配其Album
属性 - 它并不重要,因为它存在于托管堆上,而其他所有内容只是对它的引用。
您展示的内容是一个常见的习惯用法 - 您将Track
添加到Album
(Collection
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
访问权限的典型用法。