我想用C#制作一个类似于galana的游戏。我有两种类型的敌人(行为和精灵是不同的,以及声音效果),我希望每个人都有自己的行。我之前使用数组来生成屏幕上的敌人,但显然这不是一个好方法,并被告知我应该使用列表来代替。现在,我认为可以有几种方法来创造敌人的阶级。一个人使用继承,基类为Enemy,然后是两个从敌人继承的类,但有自己的行为和精灵。另一种做法是创建一个敌人界面。另一种设置方法是使用结构。我认为使用界面会比其他两个更费时间,但我可能是错的(如果我是,请告诉我)。另外两个我不确定。从技术上讲,我相信他们都使用类,只有一个使用结构。从敌人阶层继承或使用敌方结构,这样做会更好吗?我想在行中产生两种类型的敌人(想想Galaga),我应该如何设置我的类继承明智?
回答
考虑一个简单的场景,创建Enemy类然后使用继承是最好的选择。
如果您需要一个更复杂的逻辑树来将特定方法添加到不属于同一树的实体,那么请开始使用接口。例如,如果有一个“敌人”树和一个“盟友”树,并且你希望敌人Type1(从敌人继承)和盟友Type2(从盟友继承)在他们死亡时有相同的行为,那么考虑使用接口为了那个原因。
无论如何,只是作为一个例子,当您需要管理使用该接口标记的对象列表以调用特定方法(例如“ExplodeWhenDying”的实体)时,使用接口可能是合理的。如果您不需要管理这些列表,那么只需使用共同父类上的方法(例如“实体”(敌方和盟友继承自实体)并覆盖这些方法(爆炸())。
接口更适合于你的程序需要许多可能不相关的对象类型来提供某些功能的情况,我认为这种情况并非如此。
我编写解决方案的时间越长,我越喜欢“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);
}
}
我发现你对继承的_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
雅,我花了很长时间了解组成。您在上面的示例中看到的花式术语。上面的例子使用具体的类注入,他们教导基于接口的注入。两者工作完全一样。在这里要记住一个非常微妙的规则:如果一个类型是一个子类型,使用继承。如果一个类型只包含另一个类型的属性,则通过方法或属性使用注入。 – 2014-10-12 05:07:27
这样比较好。谢谢。 +1 – MickyD 2014-10-12 05:39:40
- 1. 相同的声明,我想两种不同类型的
- 2. 我想在中继
- 3. 我想显示两种类型的jquery timepickers
- 4. 我应该继承NSMutableArray类
- 5. 我想学习COM。我应该如何继续?
- 6. 我想知道在java中有多少种类型的参数
- 7. 我应该怎么做,如果我想为两个popover设置不同的css
- 8. 想在我的IIS服务器上设置某种类型的cron相当于
- 9. 我不想继承CSS中父级的子级不透明度
- 10. 如果我不想要类型安全?
- 11. 我想在gridview使用vb.net这种类型的评级功能?
- 12. 我想继承Beautifulsoup类来完成以下任务
- 13. 我想锚点应该像输入类型提交按钮
- 14. 想与我想在我的门户网站创建这种类型的投资组合的网站
- 15. 我有一个java类和接口,我想如果有人延长我的java类应该实现接口
- 16. 我想在Android中进行说明
- 17. c#没有根据参数类型(继承)选择我想要的函数
- 18. 什么时候我想让我的私人类是静态的?
- 19. 我想用酸存储aeson's Value类型
- 20. jquery .animate() - 这种代码类型是做我想要的
- 21. 想在我的iOS应用
- 22. 我想表明在一排uicollectionview两种细胞中的所有iPhone机型
- 23. 我想从我的主类与setters声明一个数组
- 24. 我想管理magento中的类别
- 25. 如何,其中T是我自己的类,我想通过class.someString
- 26. 我想要实现的SharePoint,但我想设计自己的路
- 27. 当我想要存储这些类型的数据时,我应该如何构建我的数据库?
- 28. LINQ的继承和亚型(想筛选出基本类型)
- 29. 我应该如何使用RegExp来获得我想要的JavaScript?
- 30. 我想在我的Android
继承是大型团队编写的大型软件项目中的代码重用机制。你可能患有对象幸福疾病,这是为了自己的缘故创建复杂的继承层次结构的愿望。 – 2014-10-12 06:20:47