继承的组合 - 避免抽象类

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个问题:

  1. 我是否正确实施了作文?
  2. 我的Sword类是否也应该实现IGameObject接口?
  3. 我的IWeapon包含了IGameObject getter吗?(原因是,如果我把它存储为IWeapon,没有IGameObject getter,那我怎么能得到它的细节IGameObject?)

Eya*_*rry 6

组合与继承是一个非常重要的原则,但是,就像任何原则一样,它只有在适当应用时才会产生积极的效果.为了正确应用它,你必须了解它是如何发现的.

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)

  • +1"因为我被认为是因为开发者'在OOP上去了'." 在OOP传播的那一天和今天功能编程变得更加主流之间,我看到了一个历史性的平行线.过去的OOP大师做出了承诺,并将OOP的相当简单的机制变成了一个科学的神话.过了一段时间,人们想出了生产工作OOP系统和开发最佳实践的方法.然而,当时的工作原理仍然有效:从您的用例和子系统的表面区域开始,然后根据您的需要实施.定义良好的子系统可以使您的系统保持理智. (2认同)