Java的使用

最近我决定去看看Java,所以我还是很新的,也是面向对象编程的方法,所以我想在学习更多东西之前先弄清楚一些事情(我想这是不会很快开始的好的做法)。

我现在编程一个小2D游戏,但我认为我的问题适用于任何非平凡的项目。 为了简单,我会提供我的游戏的例子。

我有不同种类的僵尸,但他们都具有相同的属性(x,y,健康,攻击等),所以我写了一个界面僵尸,由WalkingZombie,RunningZombie TeleportingZombie等执行。这是最好的事情吗? 我更喜欢抽象类吗? 或者与一个超级class ? (我不打算部分实现函数 – 因此我select了一个接口而不是抽象类

我有一个类描述主angular(幸存者),因为它是相当大的我想写一个接口与不同的function,以便我可以很容易地看到和分享它的结构。 这是好的做法吗? 还是只是浪费空间和时间?

我希望这个问题不会被认为是主观的,因为我认为有经验的程序员不会对这种话题持不同意见,因为接口/超类/抽象类的使用遵循逻辑规则,因此不是简单的个人select。

您可以将界面视为“合同”。 您正在定义一组实现此接口的类必须实现的方法。

另一方面,抽象类用于当你想要实现的所有子类都有一些共同的代码时。 所以你可能有一个叫做Shape的抽象类,它有一些共同的代码,在派生类(Circle,Square等)中,你可以使用特定于这些形状的代码( getArea就是一个例子)。 但是像颜色这样的东西可能对所有形状都是通用的,所以你可以在你的Shape抽象类中放置一个getColor方法。

你可以结合这两个想法。 你可以有实现接口的抽象类,这给你两全其美。

这些概念在面向对象中反复使用,所以理解这些概念是很重要的。 你似乎很好:)。

所以如果你的僵尸类有一些适用于所有types的僵尸的共同行为,这听起来像是一个抽象类的好候选人。 你也可以考虑创build一个接口(也许是一个GameCharacter接口),如果你的游戏中有其他angular色(也许是UndeadMice或者其他东西:))。 然后你的Zombie抽象类和UndeadMouse抽象类将实现GameCharacter接口。

如果有疑问,我select遵循GOF范式。

封装什么变化 : – 在自己的类中定义独特的行为。 参照上面的例子,在单独的课程中实施步行,跑步和远距传物的行为。 这样就实现了多态行为。

相反,**聚合什么是常见的** – 使用抽象类来定义多态关联中的常见行为。 在devise对象之间的关系时使用这些原则。

是的,我认为你正在通过抽象类接口走上正确的轨道。

任何具体的僵尸,你可能想要的可以拥有你所关心的步行,跑步或者传送function的任何组合。

我认为现代编程理论尽可能地阻碍了inheritance,因为从长远来看它抑制了可重用性和灵活性。 相反,使用接口和组合来实现灵活性,而不是“紧密耦合”。

一种方法来重新使用没有inheritance的代码,你可以使用“inheritance优势组合”范式。

我喜欢认为Josh Bloch的“Effective Java”(第二版)可以被当作“当前的想法”…

http://books.google.com/books?id=ZZOiqZQIbRMC&pg=RA1-PA71&lpg=RA1-PA71&dq=%22Bloch%22+%22Effective+java:+programming+language+guide%22+&hl=de&sig=RxlDlRBWUvNAzsAFzqOcftrYI5E#v = onepage&q&F =假

所以,你可以实现所有的行为作为独立的类,然后给每个僵尸实现自己的行为组合,通过实施和组合..

希望这是有道理的和帮助…

我会写僵尸作为抽象类,以避免重新定义字段x,y,健康等…

对于Survivor类,我只是宣布公开要在外部使用的function。 我在class级的顶部宣布公共职能。 声明一个接口的时候,只有一个类实现无用地添加一个文件来维护。 躲开它。

没有人赞同使用超类/抽象类的接口;)

使用接口和超级/抽象类的主要原因是启用多态。 举个例子,你的屏幕上有东西(玩家和僵尸等等)。 为什么不使用相同的方法在屏幕上移动? 也许从一个名为“Movable”或类似的东西inheritance屏幕上的所有东西。

如果你真的想到这个东西,你也可以看看mixin。 这不是Java直接支持的东西,而是为它构build的库。

我有不同种类的僵尸,但他们都具有相同的属性(x,y,健康,攻击等),所以我写了一个界面僵尸,由WalkingZombie,RunningZombie TeleportingZombie等执行。这是最好的事情吗? 我更喜欢抽象类吗? 或者与一个超级class?

一个抽象类将成为僵尸的超级类。 一个界面在某种意义上也可能是你的僵尸的一个超级类(super interface?)。

通用属性至less为共同属性提供了一个抽象基类。

(我不打算部分实现函数 – 因此我select了一个接口而不是抽象类)

不知道你是什么意思。

如果你有不同种类的怪物(地精,兽人等),你可能会发现这些想要属于不同基类的共同行为。 这将提示一个界面。

我会从一个抽象的基类开始,看看代码在你写代码的时候告诉你什么。

我有一个类描述主angular(幸存者),因为它是相当大的我想写一个接口与不同的function,以便我可以很容易地看到和分享它的结构。 这是好的做法吗? 还是只是浪费空间和时间?

你的幸存者是所谓的玩家angular色(相对于非玩家angular色 – 游戏中的某个人通常不会攻击你的幸存者)。

大多数游戏将所有这些angular色types视为某种怪物,因为它们将具有许多共同的属性(健康,魔法,宝物,武器等)

所以也许这更多的是一个接口的论点。

看到:

使用inheritance和多态来解决一个常见的游戏问题 angular色扮演游戏中的angular色扮演游戏类图例子

我认为你们的界面和阶级结构不符合现实。 事实上,我相信(纠正我,如果我错了),每个僵尸可以走路,跑步,传送等取决于它在哪里。

因此,你应该有一个僵尸类或接口,并有修改僵尸状态的行动。 该动作可能是一个接口或抽象类,所以你可以应用任何行动到僵尸不知道什么确切的行动(例如action.perform(zobie) )。

如果你有不同种类的僵尸,比如三腿僵尸和单臂僵尸,你可能需要实现不同的僵尸类处理类,比如显示自己或者validation状态变化(例如一种特殊的僵尸可能会不接受被传送)。

就你的僵尸的例子而言,界面会很好,除非你有通用的代码,你想要所有的僵尸。

假设你有一个Move方法,这使得行走僵尸走,运行僵尸跑等。但是,如果你想“移动”,使任何types的僵尸做一些共同的事情,那么界面会强制你复制代码,因为你不能把一个身体放在一个界面中。

我的看法是,你最好使用称为生物的抽象类作为所有types的生物的超类,并将其扩展到所有types的僵尸的僵尸。
而且你还需要一个界面来定义生物可以做什么
就像也许,走路,或爪,或尖叫…
你需要一个抽象类的原因是为了禁用Creature的实例化,你不想拥有一个不知道它是什么生物的生物,对吗?