Fin*_*las 5 c# inheritance casting interface
每个项目都有一个界面IItem.除此之外,还有一个称为IDrawableItem继承自Item 的接口.
下面的代码试图绘制一个可绘制的项目,但不能像这个类存储的集合那样接受IItem.您可以添加任何继承自IItem此类的内容,但使用其他方法只能通过强制转换来实现.
foreach (var item in Items) {
item.Draw(); // The casting would go here.
}
Run Code Online (Sandbox Code Playgroud)
我知道怎么演员as等......但是这可以接受吗?这是最佳做法吗?
只是想知道是否有其他方法来处理这种情况.
jas*_*son 11
用于Enumerable.OfType仅提取Items该实现的那些元素IDrawableItem:
foreach(var item in Items.OfType<IDrawableItem>()) {
item.Draw();
}
Run Code Online (Sandbox Code Playgroud)
为了解决Nanook在评论中提出的问题,上述代码可能会被翻译成相当于以下代码:
foreach(var item in Items) {
if(item is IDrawableItem) {
((IDrawable)item).Draw();
}
}
Run Code Online (Sandbox Code Playgroud)
当然,真的有幕后的迭代器看起来像这样:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,这表明我们可能只迭代Items一次.当然,没有要求OfType像上面那样实现,但这是明智之举.