如何为使用它们的子类限制抽象类中方法的参数?

时间:2017-01-04 02:47:01

标签: java oop inheritance polymorphism

我一直在尝试设计一组类来模拟经典RPG。然而,我发现自己对如何解决这个问题很困惑:如何在抽象类中强制使用角色类型(例如坦克,治疗师,DPS)特定法术/装备等。下面的例子更清楚地表达了我的意思。

我有一个抽象的PlayableCharacter类,所有字符类型都继承自:

public abstract class PlayableCharacter {
    private Set<Spell> mSpells;

    ...

    public void addSpell(Spell spell) { 
        mSpells.add(spell);
    }
}

例如:

public class Healer extends PlayableCharacter {  ...  }
public class Tank extends PlayableCharacter {  ...  }

请注意抽象类中Set的{​​{1}}。我想如果Spell的每个子类都可以使用其PlayableCharacter方法,但限制addSpell的类型对应Spell子类型。 例如,我有这些PlayableCharacter类:

Spell

我只希望public abstract class Spell { ... } public class HealerSpell extends Spell { ... } public class TankSpell extends Spell { ... } 使用HealersHealerSpells来使用Tanks等。例如:

TankSpells

我想给每个子类PlayableCharacter tank = new Tank(); tank.addSpell(new TankSpell()); // This is fine tank.addSpell(new HealerSpell()); // I want to prevent this! 它自己的PlayableCharacter子类特定的Set,但这会产生很多代码重复。

我还尝试将Spells标记为受保护,然后每个子类必须实现这样的接口:

PlayableCharacter.addSpell

并且实现它的每个子类都会调用public interface Spellable<T extends Spell> { void addClassSpell(T spell); } ,但这会导致更多的代码重复,并且没有任何东西迫使这些实现执行super.addSpell(spell);调用。

我的策略在某种程度上是否存在根本缺陷?有什么建议?我觉得这个问题会随着我添加更多特定字符类型的设备,特性等而变得越来越糟。

3 个答案:

答案 0 :(得分:1)

我不这样做(通过类型继承)。最好为法术本身添加特征,因为它是一个法术,只能通过某个角色施放。此外,特定法术可以仅转换为某种字符类型。这些规则属于咒语,而不属于角色。

可以在运行时通过单独的类或法术类本身在cast()方法或其他方法中检查法术规则。

答案 1 :(得分:0)

到目前为止你所拥有的是好的

剩下的东西,想想比超级电话更多的策略模式

所以抽象类可以有算法执行step1,step2,step3和可能的父实现

子类可以覆盖它,但只覆盖不同的部分

当您调用算法时,它会执行所有步骤

如果一切都变得太大,步骤本身可能是具有逻辑的不同类

答案 2 :(得分:0)

可能有可玩角色的每个子类存储允许的子集的(或类)。然后做一个if(allowedSpell的拼写实例)......