2

我有一个大约 100 个对象的列表,这些对象恰好是瓷砖。它看起来像这样:

 List<Tile> Tiles;

在我的代码的其他地方,我有派生自 tile 基类的类,我将在此示例中使用 house:

 public class house : Tile

在顶部列表中,我向数据结构添加了不同类型的图块:

 Tiles.add(new house());
 Tiles.add(new church()); //ect. ect.

我的问题是,如果我通过像 for 循环这样的控制结构在哪里引用该列表,我怎么知道哪些瓷砖是教堂或房屋。基本上我需要比较两个不同类型的瓷砖。甚至有可能知道我引用的是哪个子类吗?我确信对此有一个简单的解释,但是在面向对象编程方面我不是很精通,所以我什至不完全确定在寻求帮助时我应该寻找什么。

4

5 回答 5

5

这里有多种选择

  • 您可以使用is/as检查特定对象以查看它是否属于特定类型
  • 您可以添加一个鉴别器 - 可能是一个枚举属性,例如.TileType(比较:Expression.NodeType)
  • 你可以改为使用一种virtual方法,这样你就不需要知道类型是什么:你只需说“做你的类型在这里做的任何事情”(即调用虚拟方法)
于 2012-05-28T08:40:37.110 回答
2

您可以使用“is”运算符 - “Tiles[index] is house”

但总的来说,这是一件坏事——你打破了 oop 原则

你应该怎么做才能在派生类上实现方法,这样他们就会知道如何自己做逻辑,你就不必使用“is”运算符。

于 2012-05-28T08:39:22.013 回答
1

好吧,你可以这样做:

foreach (var house in Tiles.OfType<house>()) { ..
于 2012-05-28T08:39:50.163 回答
0
foreach (Tile tile in Tiles)
{
    if (tile is house)
    {
        // do things
    }
}

您可以使用上面的 is 关键字。

于 2012-05-28T08:38:55.330 回答
0

用于Object.GetType()获取当前实例的类型。

参考 MSDN 链接

于 2012-05-28T08:40:17.153 回答