【问题标题】:Calling specific class functions in a list of multiple class-types在多个类类型列表中调用特定的类函数
【发布时间】:2013-06-15 09:30:04
【问题描述】:

我正在尝试使用 C# 制作 2D 游戏(使用与问题无关的 XNA)。我制作了一个基本的瓷砖类,游戏中的所有瓷砖都将从中继承基本功能,例如如何将自己绘制到屏幕上等等。

然后,我拥有的是该基础瓷砖类的列表,其中包含从该基类继承的所有其他类,即:门、墙壁、地板瓷砖等。

    List<TileBase> tileList = new List<TileBase>();

    ...

    tileList.Add(new Door(arguments));
    tileList.Add(new Wall(arguments));

当我只想影响该列表中的某种类型的类时,问题就会出现。例如,门具有 Open()、Close() 和 Toggle() 的某些函数。 如果我尝试简单地创建一个循环,循环遍历列表中的每个 Door 类:

    foreach(Door door in tileList)
    {
            door.Toggle();
    }

我收到一个错误:

    "Unable to cast object of type '...Tiles.Wall' to type '...Tiles.Door'."

所以基本上,我有一个包含不同课程的列表。如何在循环中访问类中的特定函数而不会导致程序崩溃,因为它在另一种类型的类上尝试它没有所述函数。

【问题讨论】:

    标签: c# list class inheritance crash


    【解决方案1】:
    foreach(Door door in tileList.where(a=>a is Door))
    {
        door.Toggle();
    }
    

    【讨论】:

      【解决方案2】:

      您可以研究 OfType 方法,它根据类型进行过滤:

      using System.Linq;
      

      ...

      foreach(var door in tileList.OfType<Door>())
      {
          door.Toggle();
      }
      

      【讨论】:

      • @user2499152 将using System.Linq; 放在文件顶部,这样OfType 就会在范围内。
      • 太棒了!似乎正在工作,感谢您的快速响应!这肯定会派上用场。我很高兴解决方案很简单,因为我很难找到任何类似的问题。谢谢! :)
      【解决方案3】:

      您可以使用基类进行迭代,然后检查特定对象是否是Door 类的实例。如果是,则转换为 Door 对象。

      foreach(TileBase td in tileList)
      {
             if(td is Door)
             {
                   ((Door) td).Toggle();
             }
      }
      

      【讨论】:

      • 这可能(稍微)比 OfType 效率低,因为它会迭代未使用的对象。我认为@Khan 会对性能感兴趣,因为它是一款游戏。
      • 我之前尝试过类似的东西,但对我来说当时没有用。看来我需要你放在 td 和 (Door) 周围的括号。所以现在我有两种可能的解决方案,如果我将来需要类似的东西!谢谢!
      猜你喜欢
      • 2019-04-17
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2019-06-08
      相关资源
      最近更新 更多