猿问

具有不确定方法签名的抽象方法

我有一个设计问题。我试着写一个角色扮演游戏,让巫师互相战斗。他们通过施法互相对抗。我决定为所有法术创建一个抽象超类。


基本上,一个咒语是一个有名字的对象(例如火球),知道它的巫师(通过巫师值确定咒语的强度)并且必须施放咒语,所以它应该有一个抽象方法“cast ”。


public abstract class Spell {

    private String name;

    private Sorcerer sorcerer;

    public abstract void cast();

}

但是现在我有一个问题:我无法规范这个方法的方法签名,因为不同的咒语需要不同的参数并且可能有不同的返回值。治疗施法可以治疗巫师并且可能不需要参数。但是例如火球法术需要一个敌人作为参数。我将不得不为法术定义不同的基类。这可能会导致爆炸式的类层次结构。


有没有办法定义某种“海绵方法”来重载?或者有更好的方法来解决这个问题吗?


红颜莎娜
浏览 120回答 2
2回答

波斯汪

一种方法是使用可变参数。假设一个法术只能由一个巫师施展,它看起来像这样:public abstract class Spell {    private String name;    public abstract void cast(Sorcerer sorcerer, Target... targets);}cast 方法接受 1 个巫师和 0 个或更多目标更好的方法通过查看示例,似乎总是有一个巫师与一个法术相关联,该法术被保存到类变量 sorcerer(施放法术的角色)中。通过为那个 sorcerer 创建一个 getter,可以cast进一步简化方法签名:public abstract class Spell {    private String name;    private Sorcerer sorcerer;    public Sorcerer getSorcerer() {        return sorcerer;    }    public abstract void cast(Target... targets);}这样仍然可以从子类访问 sorcerer,但它不是方法cast签名的一部分。如果我理解正确的话,该方法还应该支持不同的返回类型。实现这一点的一种方法是创建一个类(例如 SpellConsequence),它可以包含不同的值和类型。这样可以从 cast 方法返回 SpellConsequence 类。

哈士奇WWW

怎么样void cast(Sorcerer source, Targetable target)?你可以spell.cast(myself, myself)治愈或spell.cast(myself, enemyPositionOrWhatever)。
随时随地看视频慕课网APP

相关分类

Java
我要回答