代码之家  ›  专栏  ›  技术社区  ›  Finglas

转换和接口继承

  •  5
  • Finglas  · 技术社区  · 15 年前

    每个项目都有一个接口, IItem . 除此之外,还有一个称为 IDrawableItem 从项继承的。

    下面的代码试图绘制一个可绘制的项,但无法绘制,因为此类存储的集合只接受 项目 . 您可以添加从中继承的任何内容 项目

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

    我知道怎么投, as

    2 回复  |  直到 10 年前
        1
  •  11
  •   jason    15 年前

    使用 Enumerable.OfType 只提取 Items IDrawableItem :

    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;
            }
        }
    }
    

    所以,这表明我们可能只在 一旦当然,没有要求 OfType 是像上面那样实现的,但这是明智的做法。

        2
  •  1
  •   Rafał Dowgird    15 年前

    两种备选解决方案:

    • 添加 DrawIfPossible() 方法 IItem IDrawableItem 应该覆盖它来调用 Draw() ,其他 IItem()