我正在尝试为游戏创建角色类。
关于角色类: - 它有不同的角色,例如战士,射手,国王。 - 每个都有不同的属性,例如攻击,防御。
我的问题是我应该使用继承还是合成? 我有一个Character Class,那么我应该创建warrior类并扩展字符类,还是应该在Character类中添加一个像String ID =“Warrior”这样的标识符?
答案 0 :(得分:6)
如果有一个属性组合的选项(例如,如果你有一个WarriorKing类),我会做的是为类+接口使用继承。
如果你想在WarriorKing之类的东西中享受这两种类型的属性,你可以做类似的事情:
class Character { ... }
interface Warrior {...}
interface King {...}
abstract class KingImpl extends Character implements King
abstract class WarriorImpl extends Character implements Warrior
然后你把所有东西都结合起来:
class WarriorKing extends Character implements Warrior, King {
private King kingImpl;
private Warrior warriorImpl;
public WarriorKing() {
kingImpl = new KingImpl();
warriorImpl = new WarriorImpl();
}
现在假设你在Warrior界面中有一个方法kill()
需要由每个实现类实现(WarriorKing必须实现它),并且已经在抽象的WarriorImpl类中实现了,你可以做类似的事情:
class WarriorKing extends Character implements Warrior, King {
private King kingImpl;
private Warrior warriorImpl;
public WarriorKing() {
kingImpl = new KingImpl();
warriorImpl = new WarriorImpl();
}
public void kill() {
this.warriorImpl.kill()
}
}
这样,您可以通过一次实施一切来享受所有的世界,拥有模块化的课程设计,您可以享受您可能需要的任何角色组合。祝你好运!
答案 1 :(得分:1)
我喜欢这样做的方法是写出你想拥有的每个类的所有属性和参数。查看类之间共享的参数,并确定您希望如何处理它。
由于您已经有了一个Character类,因此请确定您希望Character的实际子类有多么不同。
您还可以为不同的类使用不同的Interfaces。接口将具有特定类的唯一方法。
不要犹豫,只是为了它,你处理它并不重要,但接口和继承肯定会让你的代码更容易理解。祝你好运!
答案 2 :(得分:0)
我认为模块化设计和(后来)复杂性方面的最佳解决方案是扩展基类,因为您只能将“接口”用于“战士”或仅使用“射手”等。
考虑添加您想要仅为特定字符设置的不同方法或属性(现在或稍后)。
希望这有帮助。
最佳,
答案 3 :(得分:0)
如果所有字符共享某些属性,那么我将拥有一个具有所述属性的Character类,并且每种特定类型的字符都会扩展Character并添加它们的特定属性。
答案 4 :(得分:0)
String id =“Warrior”听起来像“串式编程”,你应该避免它。
经验法则是类层次结构不应该很深(不超过3或4级)。
我定义了一个基类(Character)和一些派生类(Warrior,Wizard等),但不会更深入:
看起来你的角色确实有不同的属性,但基本上具有相同的行为(攻击,防御等)。但攻击和防御的手段是不同的(一个战士会哈希和削减,一个巫师会拼出一个魔法)。这是继承和多态的良好候选者。
答案 5 :(得分:0)
如果字符对于相同的属性具有不同的值,那么您不应该创建不同的类,但如果整个战士可以做事情/具有其他人不能拥有的不同属性,那么是。 例如:如果战士对于属性“强度”的值与魔术师不同,那么在这种情况下,不需要为每个创建子类,因为它们在概念上是相同的。但是如果魔术师可以飞,那么你应该这样做。