【发布时间】:2016-12-30 03:57:59
【问题描述】:
我有两个问题:
1.接口实现
例如,如果我们使用ArrayList,我们可以看到ArrayList实现了许多接口,其中一个接口是IEnumerable,它有一个抽象方法
IEnumerator GetEnumerator();
如果我们在VS中定义ArrayList,我们可以看到有一个方法
public virtual IEnumerator GetEnumerator();
但是为什么要有关键字“虚拟”呢?这个方法不应该实现IEnumerable中的方法吗?所以应该有方法:
public IEnumerator GetEnumerator();
?
2。链表
我看到一些这样的 LinkList 代码:
LinkedList<Data> myDataList = new LinkedList<Data>();
LinkedListNode<Data> lln;
for (int i = 0; i < 10; i++) //Method 1
{
myData = new Data(i);
lln = myDataList.AddLast(myData);
}
for (int i = 10; i < 20; i++) // Method 2
{
lln = new LinkedListNode<Data>(new Data(i));
myDataList.AddLast(lln);
}
我可以理解方法2,首先将数据添加到LinkedListNode而不是将LinkedListNode添加到LinkedList。但是貌似方法一只是直接往LinkedList里添加数据?是不是说如果我们直接往LinkedList里添加数据,LinkedList内部会先把数据添加到LinkedListNode然后再把LinkedListNode添加到LinkedList中,和方法2一样?
【问题讨论】:
-
virtual所以任何子类都可以override它的实现。 -
为一个问答线程提出一个问题sigh,你问第一个和第二个有什么区别吗?它确实做同样的事情。你读过LinkedList<T>.AddLast,它添加了一个新节点并返回它。
-
@Bagus Tesa 我知道任何子类都可以重写该方法,但是由于 ArrayList 实现了 IEnumerable,但它没有提供 IEnumerable 中方法 (GetEnumerator()) 的实现。
标签: c# arraylist interface linked-list