我想在行中产生两种类型的敌人(想想Galaga),我应该如何明智地设置我的类继承?

时间:2014-10-12 02:37:28

标签: c# class inheritance struct xna

我想使用C#在xna中制作类似于galaga的游戏。我有两种类型的敌人(行为和精灵是不同的,以及声音效果),我希望每个人都有自己的行。我之前使用数组在屏幕上生成敌人,但显然这不是一个好方法,并被告知我应该使用列表。现在,我在想可能有一些方法可以自己创建敌人类。一个是使用继承,一个是Enemy的基类,然后是另外两个从Enemy继承而且有自己的行为和精灵的类。另一种方法是创建一个敌人界面。设置它的另一种方法是使用结构。我认为使用界面会比其他两个更耗时,但我可能是错的(如果我,请告诉我)。另外两个我不确定。从技术上讲,我相信他们都使用类,只有一个使用结构。这样做的更好方法是什么,从敌人类继承,还是使用敌人结构?

2 个答案:

答案 0 :(得分:1)

我编写解决方案的时间越长,我就越喜欢“赞成组合而不是继承”的概念。它并不意味着拒绝继承,但在我过去很多次我过度使用继承。组合的优点是层次结构中的最低对象总是可扩展的,从来没有任何名称混淆,它导致更好的单元测试。

但是什么是作文?它只是在父对象中包含其他对象的能力。我通常使用属性getter和setter来公开对象,如下例所示。所有汽车都有轮子和发动机以及颜色,并且可能是不变的,但它们不是任何类型的,所以最好是组合它们或“注入”特征......这是组合并显示具体的类(不是接口) 。接口更好,但您不必这样做。

public class ComposeACar
{
    public ComposeACar(Wheels theWheels, Engine theEngine, Color theColor)
    {
        MyWheels = theWheels;
        MyEngine = theEngine;
        MyColor = theColor;
    }
    public Wheels MyWheels { get; set; }
    public Engine MyEngine { get; set; }
    public Color MyColor { get; set; }
}


public class Wheels {
    public string size { get; set; }
    public decimal price { get; set; }
    public string Manufacturer { get; set; }
}
/// <summary>
/// Same here for the next two class examples
/// </summary>
public class Engine {}
public class Color {};

public class BuildACar {

    public BuildACar()
    {
        var wheels = new Wheels { Manufacturer = "GoodYear", size = "17", price = 195.00M };
        var engien = new Engine();
        var color = new Color();
        var newCar = new ComposeACar(wheels,engien,color);
    }
}

答案 1 :(得分:0)

考虑一个简单的场景,创建Enemy类然后使用继承是可行的方法。

如果您需要更复杂的逻辑树来向不属于同一树的实体添加特定方法,请开始使用接口。例如,如果有一个&#34; Enemy&#34;树和一个&#34; Ally&#34;树和你想要敌人Type1(继承自Enemy)和ally Type2(继承自Ally)的某种相同行为,当他们死亡时,然后考虑使用接口。

无论如何,作为一个例子,当你需要管理用该接口标记的对象列表来调用特定的方法时,可以证明接口的使用是合理的(例如&#34; ExplodeWhenDying&#34;的实体) 。如果您不需要管理这些类型的列表,那么只需在公共父类上使用方法(例如&#34;实体&#34;(Enemy和Ally从实体继承)并覆盖这些方法(Explode( ))。

接口更适合于程序需要许多可能不相关的对象类型以提供某些功能的情况,我猜这不是这种情况。