2016-12-30 74 views
0

我有两个问题:接口实现和LinkedList

1接口实现

例如,如果我们使用ArrayList中,我们可以看到的ArrayList实现了许多接口,接口一个是IEnumerable的具有的

IEnumerator GetEnumerator(); 

一个抽象的方法,如果我们去在VS ArrayList中的定义,我们可以看到是

的方法
public virtual IEnumerator GetEnumerator(); 

但为什么应该有关键字“虚拟”?该方法不应该在IEnumerable中实现该方法吗?所以有方法应该是:

public IEnumerator GetEnumerator(); 

2.链表

我看到链表一些这样的代码:

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到链表。但是它看起来像方法1直接将数据添加到LinkedList中?是否意味着如果直接向LinkedList中添加数据,LinkedList将通过向LinkedListNode添加数据在内部创建LinkedListNode,然后将LinkedListNode添加到LinkedList,与方法2相同?

+0

['virtual'](https://msdn.microsoft.com/en-us/library/9fkccyh4.aspx)所以任何子类都可以“覆盖”它的实现。 –

+0

问一个问题 - 单个问题答案线程*叹气*,那么你问第一个和第二个右侧有什么区别?它也做同样的事情。你读过[LinkedList .AddLast](https://msdn.microsoft.com/en-us/library/ms132177(v = vs.110).aspx),它添加了一个新节点并返回它。 –

+0

@Bagus Tesa我知道任何子类都可以重写该方法,但是由于ArrayList实现了IEnumerable,但它不提供IEnumerable中的方法(GetEnumerator())的实现。 – grooveline

回答

1

但为什么应该有一个关键字“虚拟”?

virtual关键字是允许子类覆盖其实现。这件事没什么特别的。当然,你不想要这个简单而明显的答案,你想知道为什么有人会重写它。举个简单的例子,假设你创建了自己的GrooveArrayList,它内部保存了另外两个IEnumerables(比方说,水果和一系列汽车列表)。如果您将GrooveArrayList置于foreach语句并开始枚举它,会发生什么?它是否应该迭代水果和汽车?按什么顺序?它应该跳过一些取决于某些条件?如果您的IEnumerable(在本示例中为GrooveArrayList)具有一些定制逻辑来重复的事情,则可以覆盖此方法并放置该逻辑。我知道这个例子有点荒谬,但它只是为了澄清为什么有人需要重写它。我其实不是自己做的,所以...


编辑:

这是ArrayList实施GetEnumerator()

public virtual IEnumerator GetEnumerator() { 
    Contract.Ensures(Contract.Result<IEnumerator>() != null); 
    return new ArrayListEnumeratorSimple(this); 
} 

Source


这是否意味着如果我们直接向LinkedList添加数据,那么LinkedList将通过向 添加数据来在内部创建LinkedListNode LinkedListNode然后将LinkedListNode添加到LinkedList中,与方法2相同 做了什么?

没错。当您直接将Data添加到LinkedList时,它将在内部为该Data创建一个LinkedListNode,将该节点添加到其节点并返回该创建的节点,以便您可以执行任何想要的操作。

实际上,它们允许您采用两种方式,因此您可以根据具体情况决定使用哪一种。那有多好?

+0

嗨,Alisson。谢谢您的回答。对于问题一,我明白你说了什么,但我的问题是,ArrayList不提供IEnumerable中的方法的实现。 – grooveline

+0

我只是直接使用ArrayList而不使用任何subList:ArrayList,所以我的问题是如何在IEnumerable中实现GetEnumerator()?通过哪个子类? – grooveline

+0

@grooveline我明白你的问题。如果您只是在visual studio中按'F12',则根本看不到代码。看到我编辑的答案,我提供了该方法的实现,并将链接添加到源代码中。让我知道它是否对你有帮助。 – Alisson