【问题标题】:interface implementation and LinkedList接口实现和LinkedList
【发布时间】: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


【解决方案1】:

但是为什么要有个关键字“虚拟”呢?

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


编辑:

这是ArrayListGetEnumerator() 实现:

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

Source


是不是说如果我们直接往LinkedList中添加数据, LinkedList 将通过向内部添加数据来创建 LinkedListNode LinkedListNode 然后将 LinkedListNode 添加到 LinkedList 与方法 2 相同 有吗?

没错。当您将Data 直接添加到LinkedList 时,它将在内部为该LinkedListNode 创建一个LinkedListNode,将节点添加到其节点,并返回该创建的节点,这样您就可以做任何您想做的事情它。

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

【讨论】:

  • 嗨,艾莉森。谢谢您的回答。对于问题一,你说的我明白,但我的问题是,ArrayList没有提供IEnumerable中方法的实现。
  • 我只是直接使用 ArrayList 而不使用任何 subList :ArrayList,所以我的问题是 IEnumerable 中的 GetEnumerator() 是如何实现的?属于哪个子类?
  • @grooveline 我理解你的问题。如果你只是在 Visual Studio 中按F12,你根本看不到代码。查看我编辑的答案,我提供了该方法的实现,并提供了源链接。让我知道它是否对您有帮助。
  • 我居然找到了“public override IEnumerator GetEnumerator() { return _list.GetEnumerator(); }”的方法我想这就是我要找的方法
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2016-03-15
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多