2 c# oop inheritance composition
我正在阅读这篇关于继承的组合的wiki文章,在这个例子中他们使用了一个抽象类.假设你想避免他们完全使用抽象类,只使用具体的类.我想知道,我的例子是正确使用构图.假设我有以下IGameobject接口.
public interface IGameObject
{
string Name {get;}
}
Run Code Online (Sandbox Code Playgroud)
以及随后的武器界面:
//Note the IGameObject getter
public interface IWeapon
{
int Damage {get; }
IGameObject gameObject {get;}
}
Run Code Online (Sandbox Code Playgroud)
通常,在我的游戏中,武器是一个 IGameObject.然而,考虑到我们正在使用组合,根据维基文章,这是一种关系.
现在,我可以在创建Sword对象时执行此操作:
public class Sword : IWeapon
{
private IWeapon weaponObject;
public Sword(IWeapon weapon)
{
this.weaponObject = weapon;
}
public int Damage
{
get
{
return this.weaponObject.Damage;
}
}
public IGameObject gameObject
{
get
{
return this.weaponObject.gameObject;
}
}
Run Code Online (Sandbox Code Playgroud)
}
我现在可以将我的剑存放在一个集合中,例如List:
List<IWeapon> weapons = new List<IWeapon>();
weapons.add(swordObj)
Run Code Online (Sandbox Code Playgroud)
并且仍然可以访问我的IGameObject.
现在,我有3个问题:
IGameObject接口?IGameObject getter吗?(原因是,如果我把它存储为IWeapon,没有IGameObject getter,那我怎么能得到它的细节IGameObject?)组合与继承是一个非常重要的原则,但是,就像任何原则一样,它只有在适当应用时才会产生积极的效果.为了正确应用它,你必须了解它是如何发现的.
C vs I之所以被认为是因为开发人员在OOP上去了城镇,特别是在像C++那样允许多重继承的语言中.正如你想象的那样,设计方面的一切都很快就下坡了.
通过以下方式很容易想到这个原则:我们作为OOD系统设计者希望以最类似于我们想要模仿的域的方式建模域对象关系 - 因此我们需要仔细仔细地查看这些关系.
无论何时即将继承,都要考虑继承是否密切描述了相关实体之间的真实世界关系.
在你的情况下,武器实际上是一个游戏对象,所以继承实际上是一个好主意,并将沿途推动多态性.
以下是C vs I如何在您的域中应用的示例:
interface IGameCharacter
{
ICollection<IWeapon> Weapons {get;}
ICollection<IGameCharacter> Party {get;}
}
Run Code Online (Sandbox Code Playgroud)