我正在尝试制作棋盘游戏的端口。棋盘游戏中的每个玩家选择八个不同角色中的一个。每个角色都有一种特殊的能力和一些风味文本,但除此之外,它们或多或少相同。
目前我有一个BaseHero
课程。我为八个不同的角色中的每一个创建了一个类,并让它们扩展BaseHero
。但是,永远不会有多个相同字符的实例。这是实现这个的最佳方式吗?
我的另一个想法是创建一个CharacterList
类,其中包含所有特殊能力和布尔测试的代码,以确定它们是否存在于游戏中,但我觉得这样做太笨重了明显不模块化。
答案 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有飞行和魔法,而飞马飞行和速度左右。