(OOP / Java)我应该如何处理这个子类 - 超类关系?

时间:2013-09-20 19:32:59

标签: java oop

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

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

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

5 个答案:

答案 0 :(得分:1)

如果类存在与否,则实例数与事实无关。仅将类实例化一次是完全正常的。 BaseHero的设计听起来很合理。

答案 1 :(得分:1)

我会使BaseHero抽象化,这样你就无法在不将其子类化为不同的字符的情况下实例化它,同时仍然获得一些不错的继承优势。你也可以强制执行单例模式,这样每次只能创建一个模式,尽管也可以像你说的那样设置一个标记来判断是否采用了这个字符。

CharacterList应该是别的东西。如果您需要一个字符列表,您只需创建一个List<BaseHero>。将所有其他逻辑放入List类中是没有意义的。

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

答案 2 :(得分:1)

我认为 BaseHero 应该是抽象类,并使用两种抽象方法 specialAbility someFlavorText 。您可以根据需要在字符自己的类中根据需要定义两个方法。

答案 3 :(得分: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更好,更灵活)

但是如果你想使用inheritence,你可以看一下Decorator Pattern

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

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

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

答案 4 :(得分:0)

我宁愿把它塑造成一个有文字和一些能力的英雄。文本来自属性文件。您是否可以先将常用文本和特殊文本加载到Properties对象中。我会用不同的类来模拟每种能力。这允许您使用不同的能力组来建模新的角色类。也许fay有飞行和魔法,而飞马飞行和速度左右。