【问题标题】:Is there a way to pull specific child class from a parent class object variable?有没有办法从父类对象变量中提取特定的子类?
【发布时间】:2022-12-19 18:50:30
【问题描述】:

我有一个包含 Mob 对象的 Room 类。一个 Mob 对象可以是 Passive 类型或 Hostile 类型,并且每个对象都有自己特定的行为。这些 Mob 对象会从一个房间移动到另一个房间。如果一个 Player 试图与其中一个战斗,我需要一种方法来调用 Mob 实际类型的特定行为。就像,被动将试图逃避,而敌对将试图反击。有没有办法不用铸造就可以做到这一点?

public class Room {
    private Mob mob;
    public Mob Mob { get; set; }
}

public abstract class Mob {
    protected Room room;
}

public class Passive : Mob {
    // Some passive-specific code
    public void Run() { }
    public void SayGreeting() { }
    public void SayGoodbye() { }
}

public class Hostile : Mob {
    // Some hostile-specific code
    public void Fight() { }
    public void SayOnLose() { }
    public void SayOnWin() { }
}

我知道 (Passive)myRoom.Mob 和 (Hostile)myRoom.Mob 可以做到这一点,但我想知道是否有更好的选择。谢谢。

【问题讨论】:

  • 你可能不想那样做。考虑实施策略并调用通用方法。

标签: c# object oop inheritance parent-child


【解决方案1】:

您应该利用继承和多态性。一种选择是在基类中为默认操作声明一个方法,然后覆盖它并在每个基类中适当地实现它,例如

public abstract class Mob
{
    protected Room room;

    public abstract void PerformDefaultAction();
}

public class Passive : Mob
{
    // Some passive-specific code
    public void Run() { }

    public override void PerformDefaultAction()
    {
        Run();
    }
}

public class Hostile : Mob
{
    // Some hostile-specific code
    public void Fight() { }

    public override void PerformDefaultAction()
    {
        Fight();
    }
}

现在,您只需在每个 Mob 引用上调用 PerformDefaultAction,它就会根据其运行时类型适当地运行,而您不必知道那是什么。

您甚至不必再需要 RunFight 方法,因为您只需将特定于类型的代码放在 PerformDefaultAction 方法中即可。不过,您可能有理由想要保留它们。

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2020-06-04
    相关资源
    最近更新 更多