Reputation: 123
right now I am doing a game which requires Monsters. I made a MonsterBase
class that every other monster will inherit from. This is a console game so I give every LowLevelMonster
instance different coordinates.
In a different method I want to check if the player is on the same coordinates as one of the monster instances. Right now i can only use an if
statement to ask for the PositionX
& PositionY
of every monster instance. This scales terribly if I get to over 5 monsters.
My question: Since the other monster instances inherit from MonsterBase
, is it possible to check for the PositionX
& PositionY
of MonsterBase
that calls for every inhertied instance of it?
Something like:
if(Player.PositionX == MonsterBase.PositionX)
{
Console.WriteLine("the names of the Monsters instances that have the same X Coordinates");
}
These are my current classes:
public class MonsterBase
{
int PositionX = 0;
int PositionY = 0;
}
public class LowLevelMonster : MonsterBase
{
string name = "monster";
int HP = 5;
}
Upvotes: 0
Views: 79
Reputation: 13069
Nope, this isn't how inheritance works, there's no implied link from an instance of the base class to an instance of the child.
You are going to have to keep a record of all your monsters in a collection, something like List<MonsterBase>
or Collection<MonsterBase>
then you can filter the list.
listOfMonsters.Where(monster => monster.PositionX == Player.PositionX)
What is a lambda expression
Think of a lambda expression as shorthand way to write a method.
Moving the expression monster => monster.PositionX == Player.PositionX
to a variable will get you
Expression<Func<MonsterBase, bool>> lambda =
monster => monster.PositionX == Player.PositionX;
listOfMonsters.Where(lambda);
This is a little easier to see what's happening. listOfMonsters.Where()
expects a parameter of type Expression<Func<MonsterBase, bool>>
where the lambda is essentially a method delegate that takes a single parameter (named monster
) and returns a boolean value.
This could have also been written
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);
This is a different overload of Where
that takes a method group which is essentially the same as.
listOfMonsters.Where(monster => Player.ComparePosition(monster));
Upvotes: 1