【发布时间】:2010-04-23 22:14:43
【问题描述】:
我有一个名为“Entity”的类,它有两个子类:“Creature”和“Item”。 (我正在制作游戏。) Creature 有两个功能,称为“攻击”,一种用于攻击生物,另一种用于攻击物品。到目前为止,一切正常。
现在我正在处理拍摄位,所以我有一个名为 SelectTarget() 的函数。它获取玩家视野中玩家可以射击的所有实体(生物和物品)并让玩家选择一个。
所以问题就在这里:SelectTarget() 返回一个实体,但我需要一些代码来确定该实体是生物还是物品,并适当地处理它。
由于没有任何代码,这个问题看起来有点空洞,而且我不能 100% 确定我的解释是否足够好,这就是我所在的位置:
if (Input.Check(Key.Fire)) {
Entity target = Game.State.SelectTarget.Run();
this.Draw();
if (target != null) {
//Player.Attack(target);
// This won't work, because I have:
// Player.Attack((Creature)Target)
// Player.Attack((Item)Target)
// but nothing for Entity, the parent class to Creature and Item.
return true;
}
}
(如果游戏的布局看起来很奇怪,那就是 Roguelike。)
【问题讨论】:
-
仅供参考,您正在寻找的通常称为“双重虚拟调度”,其有用的典型示例是“两个事物在游戏中发生碰撞,需要调用正确的方法根据它们的运行时类型对它们进行排序”。 C# 是一种单一的虚拟调度语言;正如 SLaks 所指出的,在单一调度语言中实现双重调度的标准模式是访问者模式。
标签: c# class inheritance