我有一个简单的2D游戏概念。想象一下最终幻想/ D& D设置。我在C#工作,但它更像是一般的单继承OO问题。我只是假设有一个方案,你可以实现许多接口,但只继承一个类。
游戏中有三种类型的实体:玩家,村民和敌人。为了澄清,可能会有多个玩家(AI),因为有些玩家可能加入该聚会。
对于行动: 玩家可以进行战斗和对话。村民只能使用对话。敌人只能做战斗。
状态: 所有实体在地图上都有一个位置。 战斗员总是有健康,最大健康等。 对话实体总是有一些特定的问候语,对话选项等。
玩家,村民和敌人将成为我的具体课程。我似乎想要2个接口:Combat和Dialogue,处理所有动作。到目前为止这么好 - 然而,这些实体以单一继承问题的方式共享状态。基于我的设计,似乎我想要
这里的问题是Player想要继承Combatant和Dialogue抽象类。单继承,我不能。如果可以的话,我会从Entity类中获得钻石继承问题。即使我只是让我的具体类继承实体,这将是另一个多继承问题。当然,如果我完全将实体部分从等式中取出并仅将实体分别映射到位置,我仍然会遇到Player从两个类继承的问题。
我无法想出一个不会重复实现的单继承设计。为此场景设置类/接口层次结构的最佳方法是什么?
答案 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将提供丰富的材料。