Rarowcun
Rarowcun

Reputation: 123

Checking for instances through the base class

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

Answers (1)

phuzi
phuzi

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

Related Questions