转换和接口继承

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像上面那样实现,但这是明智之举.

  • 不,它会传输结果. (2认同)