c# - 在 C# 中使用 GetType/instanceof 与替代方案

标签 c# oop object reflection instanceof

我在用 C# 制作的游戏中遇到了一个问题。这是一个简单的基于图 block 的配对游戏,问题出现在我尝试制作的 Prop 上:

假设我们有基本的瓷砖类型,圆形、方形和菱形,它们都是 Tile 的子类。我尝试将“匹配”行为提取到一个抽象的 Tile 方法:canMatchWith(Tile t),而不是让圆圈只与圆圈匹配。 Tiles 也有两种方法来添加/删除它们可以匹配的 Tiles。

假设我们在游戏中间有一个圆形瓷砖,并且我们有一个通电,上面写着“圆形瓷砖在本回合可以与方形瓷砖相匹配”。我会遍历所有 Circle 磁贴并说 circleTile.addCanMatchWith(typeof(Square))。在内部,我们有一个 List canMatchWith。

然后,我想说“圆不能再与正方形匹配”,简单说一下circleTile.removeCanMatchWith(typeOf(Square))。

这是我目前的解决方案,它工作得很好,没有我注意到的性能缺陷(这是一个基于图 block 的匹配游戏,所以这些类型每次“移动”只评估一次,而不是逐帧评估)。但是,我脑海中的声音告诉我,这是完成此行为的糟糕方法。所以我有一些选择:

  1. Enums... 每个 Tile 都可以由一个 Tiletype 类型变量组成。这将在构造函数中初始化并设置为 Type.SQUARE 用于正方形,等等。然后,每个Tile都会有一个List canMatchWith,功能和我原来的实现是一样的。除了在这种情况下,它有点棘手。假设我有一些圆形子类,椭圆形和椭圆形。我希望椭圆形只能匹配正方形,但椭圆形可以匹配所有圆圈而不是正方形。

这里的问题是冗余,我的枚举现在也将具有 OVAL 和 ELIPSE,并且 Elipse 类将具有 (CIRCLE、OVAL、ELIPSE TileTypes) 作为它可以匹配的类型。这完全是多余的,我只想说“圆”,我可以用这些类型。我想 Tiles 可能有 TileType baseType 和 TileType actualType。

  1. 某种形式的行为组合。忘记 Tile 子类,只需为 List 提供 Tiles 方法和一个实例变量。然后,在运行时我们可以只说 someTile.addCanMatch(new CircleMatchBehavior())。这看起来很愚蠢,因为我会有一堆类只是说你可以匹配特定的形状。

总而言之,我想要完成的是让多个对象类型能够与任意数量的不同类型进行交互。问题是,我应该为 Type 使用什么。这里用GetType可以吗?枚举?还是有人会推荐更好的策略?我试图尽可能通用,这些磁贴不应该对其他磁贴有任何硬编码依赖性,并且必须能够动态更改它们可以与之交互的对象。假设我创建了一个新的 Tile 子类,pentagon...好吧,Pentagons 可以与 Squares、Circles 和 Pentagons 相匹配。我的实现很容易,但有些事情告诉我这是一种肮脏的 OOP 做法。

我觉得我必须使用类型/枚举,因为我不想说 thisTile.addCanMatch(Tile someOtherObject)。这太具体了,我希望 thisTile 能够与作为特定类实例的所有图 block 匹配。

最佳答案

如果相似类型的所有形状总是共享一个行为,那么不将该行为存储在“每个实例”级别上是有意义的。相反,您可以有一个“CanMatchManager”,它存储一个列表字典,按形状类型索引。然后,当一个圆尝试比较匹配项时,它会从 MatchManager 请求它可以匹配的类型。或者,MatchManager 可以接受这两个形状,并确定它们是否匹配。这是 Mediator Pattern

关于c# - 在 C# 中使用 GetType/instanceof 与替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29903336/

相关文章:

c# - 何时连接事件处理程序 asp.net

c# - 为什么CefSharp显示 'Not allowed to load local resource: file:///C:/...'?

c++ - 为什么我必须声明一个静态 vector ?

java - 如何在Java中根据公共(public)属性合并两个排序的对象列表

java - 如何从使用类加载器创建的类中调用方法

c# - 抛出 NullReferenceException 但对象通过了 null 检查,这怎么可能?

c# - 为什么在接口(interface)列表中的泛型内部使用私有(private)嵌套类型不是 "inconsistent accessibility"?

ruby-on-rails - rails : too many methods in model

java - 为什么Java接口(interface)不能通过不太具体的功能来实现

javascript - 如何在字典末尾追加键值对?