gpt4 book ai didi

c# - 转换和接口(interface)继承

转载 作者:太空狗 更新时间:2023-10-29 22:20:59 27 4
gpt4 key购买 nike

每个项目都有一个接口(interface),IItem。除此之外,还有一个称为 IDrawableItem 的接口(interface),它继承自 Item。

下面的代码试图绘制一个可绘制项目,但不能作为此类存储的集合只接受 IItem。您可以将继承自 IItem 的任何内容添加到此类,但使用其他方法只能通过强制转换来实现。

foreach (var item in Items) {
item.Draw(); // The casting would go here.
}

我知道如何转换,as 等等...但这可以接受吗?这是最佳做法吗?

只是想知道是否有其他方法可以处理这种情况。

最佳答案

使用Enumerable.OfType仅提取实现 IDrawableItemItems 元素:

foreach(var item in Items.OfType<IDrawableItem>()) {
item.Draw();
}

为了解决 Nanook 在评论中提出的问题,上面的代码可能会被翻译成等价于以下的代码:

foreach(var item in Items) {
if(item is IDrawableItem) {
((IDrawable)item).Draw();
}
}

当然,幕后真的有一个看起来像这样的迭代器:

public static IEnumerable<T> OfType<T>(this IEnumerable<TSource> source) {
if(source == null) {
throw new ArgumentNullException("source");
}
foreach(TSource item in source) {
if(item is T) {
yield return (T)item;
}
}
}

所以,这表明我们可能只迭代 Items 一次。当然,并不要求像上面那样实现 OfType,但这是明智的做法。

关于c# - 转换和接口(interface)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072814/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com