在游戏中应对单一继承

时间:2015-02-12 10:29:45

标签: oop inheritance multiple-inheritance

我有一个简单的2D游戏概念。想象一下最终幻想/ D& D设置。我在C#工作,但它更像是一般的单继承OO问题。我只是假设有一个方案,你可以实现许多接口,但只继承一个类。

游戏中有三种类型的实体:玩家,村民和敌人。为了澄清,可能会有多个玩家(AI),因为有些玩家可能加入该聚会。

对于行动: 玩家可以进行战斗和对话。村民只能使用对话。敌人只能做战斗。

状态: 所有实体在地图上都有一个位置。 战斗员总是有健康,最大健康等。 对话实体总是有一些特定的问候语,对话选项等。

玩家,村民和敌人将成为我的具体课程。我似乎想要2个接口:Combat和Dialogue,处理所有动作。到目前为止这么好 - 然而,这些实体以单一继承问题的方式共享状态。基于我的设计,似乎我想要

  • 在地图上有位置的抽象实体类
  • 抽象类AbstractCombatant其他AbstractDialogue都继承自Entity。例如,AbstractCombatant具有健康,设备等状态。

这里的问题是Player想要继承Combatant和Dialogue抽象类。单继承,我不能。如果可以的话,我会从Entity类中获得钻石继承问题。即使我只是让我的具体类继承实体,这将是另一个多继承问题。当然,如果我完全将实体部分从等式中取出并仅将实体分别映射到位置,我仍然会遇到Player从两个类继承的问题。

我无法想出一个不会重复实现的单继承设计。为此场景设置类/接口层次结构的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

您希望在问题域/业务领域中为每个概念(玩家,敌人,村民等)创建一个类是很自然的。当这些概念具有共同特征时,问题自然会出现。考虑这个例子:

class House : IHouse
{
    public int StreetNumber { get; }
}

class Boat : IBoat
{
    public double SpeedKnots { get; }
}

class HouseBoat : House, Boat  // does not compile
{
}

解决这个问题的最简单方法是使用聚合。

平衡

保留对所有基础概念的引用,并实现适当的接口以提供所有必需的功能。

class HouseBoat : IHouse, IBoat // implementing both interfaces is ok
{
    private House house;
    private Boat boat;

    int IHouse.StreetNumber { get { return this.house.StreetNumber; } }
    double IBoat.SpeedKnots { get { return this.boat.SpeedKnots; } }
}

从其中一个概念(更相似的概念)中导出并实现其他概念的接口。

class HouseBoat : Boat, IHouse // is more like a Boat
{
    private House house; // model for the house aspects

    int IHouse.StreetNumber { get { return this.house.StreetNumber; } }
}

进一步阅读

这是一个非常常见的问题,因为它自然如上所述,Java和C#都不允许多重继承。一个简单的google query with the right search terms将提供丰富的材料。