1

我正在尝试制作棋盘游戏的端口。棋盘游戏中的每个玩家选择八个不同角色之一。每个角色都有一个特殊的能力和一些风味文字,但除此之外,它们或多或少是相同的。

目前我有一BaseHero堂课。我为八个不同的字符中的每一个创建了一个类,并让它们扩展BaseHero。但是,永远不会有同一个角色的多个实例。这是实现这一点的最佳方式吗?

我的替代想法是创建一个CharacterList类,其中包含所有特殊能力的代码和布尔测试,以确定它们是否存在于游戏中,但我觉得这太笨拙且明显不模块化。

4

5 回答 5

1

我会做BaseHero抽象,这样你就不能实例化它而不将它子类化为不同的字符,同时仍然可以获得一些很好的继承好处。您还可以强制使用单例模式,以便一次只能创建一个,尽管也可以很容易地设置一个标志来确定该字符是否被采用,就像您所说的那样。

CharacterList应该是别的东西。如果你需要一个字符列表,你可以创建一个List<BaseHero>. 将所有其他逻辑放入 List 类对我来说没有意义。

此外,在制作角色时,请尝试遵循组合而不是继承。例如,字符 HASA 能力而不是字符 ISA characterWithAbility。

于 2013-09-20T19:40:32.230 回答
1

我认为BaseHero应该成为抽象类,并使用两个抽象方法specialAbilitysomeFlavorText。您可以根据需要在角色自己的类中根据需要定义这两种方法。

于 2013-09-20T20:06:36.897 回答
1

从我的角度来看,也许接口/抽象类是解决方案,例如:

// the abstract interface which can be called "BaseHero"
public interface Character {

    void action();

    void special();

    // another general methods

}


// The true implementation of the characters
public class HeroOne implements Character{

    @Override
    public void action() {
        // do the actions
    }

    @Override
    public void special() {
        // do the specials
        HeroOneShapeAfterSpecial();
        // and so on
    }

    public void HeroOneShapeAfterSpecial(){
        // Hero One's special method
    }
}


// another implementation
public class HeroTwo implements Character{

    @Override
    public void action() {
        // Hero Two action
    }

    @Override
    public void special() {
        // Hero Two Special
    }
}



//an example to use them
public class Main {

    // a way to use those Characters
    public static void main(String[] args) {
        Character heroOne = new HeroOne();
        Character heroTwo = new HeroTwo();

        // some commands from what ever input
        heroOne.action();
        heroTwo.action();
        heroOne.action();
        heroTwo.special();

        //and so on

        // another way
        LinkedList<Character> charactersTeam = new LinkedList<Character>();
        charactersTeam.add(heroOne);
        charactersTeam.add(heroTwo);

        for(Character character : charactersTeam){
            character.special();
        }

   }
}

一般来说,OO设计偏爱组合而不是继承(HAS-A关系比IS-A更好,更灵活)

但是如果你想使用继承,你可以看看装饰器模式

如果您希望子类不被多次实例化,您可以使您的子类 Singletons ... 像:

Character heroOne = HeroOne.getInstance();
Character heroTwo = HeroTwo.getInstance();

对于你说的特殊能力,special()方法可以绑定每个角色的特殊能力,因为它是抽象的,每个角色都会实现它

于 2013-09-20T20:35:46.187 回答
1

实例的数量与该类是否应该存在无关。只实例化一个类是完全正常的。你的设计BaseHero听起来很合理。

于 2013-09-20T19:39:21.507 回答
0

我宁愿将其建模为具有文字和某些能力的英雄。文本来自属性文件。您可以先将常用文本加载到 Properties 对象中,然后再将特殊文本加载到 Properties 对象中。我会用不同的类别来模拟每种能力。这允许您使用不同的能力集来模拟新的角色类。也许仙女有飞行和魔法,而飞马有飞行和速度左右。

于 2013-09-20T20:55:41.180 回答