通过基类检查实例

  • 本文关键字:实例 基类 c# inheritance
  • 更新时间 :
  • 英文 :


现在我正在做一个需要怪物的游戏。我制作了一个MonsterBase类,其他怪物都会继承这个类。这是一个控制台游戏,所以我给每个LowLevelMonster实例不同的坐标。在另一种方法中,我想检查玩家是否与其中一个怪物实例在同一坐标上。现在我只能使用CCD_ 3语句来请求PositionX&每个怪物实例的PositionY。如果我遇到5个以上的怪物,这个比例会非常大。

我的问题:由于其他怪物实例继承自MonsterBase,是否可以检查PositionX&MonsterBasePositionY调用它的每个固有实例的

类似于:

if(Player.PositionX == MonsterBase.PositionX)
{
Console.WriteLine("the names of the Monsters instances that have the same X Coordinates");
}

这些是我目前的课程:

public class MonsterBase 
{
int PositionX = 0;
int PositionY = 0;
}
public class LowLevelMonster : MonsterBase
{
string name = "monster";
int HP = 5;
}

不,继承不是这样工作的,从基类的实例到子实例没有隐含的链接。

你必须在一个集合中记录你所有的怪物,比如List<MonsterBase>Collection<MonsterBase>,然后你可以过滤列表。

listOfMonsters.Where(monster => monster.PositionX == Player.PositionX)

什么是lambda表达式

将lambda表达式视为编写方法的简写方式。

将表达式monster => monster.PositionX == Player.PositionX移动到变量将获得

Expression<Func<MonsterBase, bool>> lambda =
monster => monster.PositionX == Player.PositionX;
listOfMonsters.Where(lambda);

这更容易看出发生了什么。listOfMonsters.Where()需要一个类型为Expression<Func<MonsterBase, bool>>的参数,其中lambda本质上是一个方法委托,它接受一个参数(名为monster(并返回一个布尔值。

这也可能是

public class Player() {
public int PositionX { get; set; }
public bool ComparePosition(MonsterBase monster){
return monster.PositionX == Player.PositionX;
}
}
// then later in the code
listOfMonsters.Where(Player.ComparePosition);

这是Where的另一个过载,它采用了与.基本相同的方法组

listOfMonsters.Where(monster => Player.ComparePosition(monster));

最新更新