2014-10-12 23 views
0

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

+0

继承是大型团队编写的大型软件项目中的代码重用机制。你可能患有对象幸福疾病,这是为了自己的缘故创建复杂的继承层次结构的愿望。 – 2014-10-12 06:20:47

回答

0

考虑一个简单的场景,创建Enemy类然后使用继承是最好的选择。

如果您需要一个更复杂的逻辑树来将特定方法添加到不属于同一树的实体,那么请开始使用接口。例如,如果有一个“敌人”树和一个“盟友”树,并且你希望敌人Type1(从敌人继承)和盟友Type2(从盟友继承)在他们死亡时有相同的行为,那么考虑使用接口为了那个原因。

无论如何,只是作为一个例子,当您需要管理使用该接口标记的对象列表以调用特定方法(例如“ExplodeWhenDying”的实体)时,使用接口可能是合理的。如果您不需要管理这些列表,那么只需使用共同父类上的方法(例如“实体”(敌方和盟友继承自实体)并覆盖这些方法(爆炸())。

接口更适合于你的程序需要许多可能不相关的对象类型来提供某些功能的情况,我认为这种情况并非如此。

1

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

但是什么是组成?这只是在父对象中包含一些其他对象的能力。我通常使用属性获取器和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); 
    } 
} 
+0

我发现你对继承的_Composition的描述有点混乱。一个描述可以发现[这里](http://en.wikipedia.org/wiki/Composition_over_inheritance)和一个不错的堆栈溢出[答案](http://stackoverflow.com/questions/178333/multiple-inheritance-in- c-sharp)可以通过** C找到[这里](http://stackoverflow.com/questions/178333/multiple-inheritance-in-c-sharp)。劳伦斯温汉**。考虑修改你的投票权轻微进行投票。 :) – MickyD 2014-10-12 04:43:08

+0

雅,我花了很长时间了解组成。您在上面的示例中看到的花式术语。上面的例子使用具体的类注入,他们教导基于接口的注入。两者工作完全一样。在这里要记住一个非常微妙的规则:如果一个类型是一个子类型,使用继承。如果一个类型只包含另一个类型的属性,则通过方法或属性使用注入。 – 2014-10-12 05:07:27

+0

这样比较好。谢谢。 +1 – MickyD 2014-10-12 05:39:40

相关问题