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



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

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

public abstract class Spell {
private String name;
private Sorcerer sorcerer;
public abstract void cast();
}

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

有没有办法定义某种"海绵方法"来重载?还是有更好的方法来解决这个问题?

一种方法是使用varargs。假设一个咒语只能由一个巫师施放,它看起来像这样:

public abstract class Spell {
private String name;
public abstract void cast(Sorcerer sorcerer, Target... targets);
}

施法接受 1 名巫师和 0 个或更多目标(更多关于 varargs 的信息 https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html#varargs(。

更好的方式

通过查看示例,似乎总有一个巫师与一个咒语相关联,该咒语被保存到类变量巫师(施放咒语的角色(中。通过为该巫师创建一个 getter,可以进一步简化cast方法签名:

public abstract class Spell {
private String name;
private Sorcerer sorcerer;
public Sorcerer getSorcerer() {
return sorcerer;
}
public abstract void cast(Target... targets);
}

这样,仍然可以从子类访问巫师,但它不是cast方法签名的一部分。

如果我理解正确,该方法还应该支持不同的返回类型。实现此目的的一种方法是创建一个类(例如SpellConresult(,该类可以保存不同的值和类型。这样,SpellConresult类就可以从强制转换方法返回。

void cast(Sorcerer source, Targetable target)怎么样? 你可以spell.cast(myself, myself)治愈或spell.cast(myself, enemyPositionOrWhatever).

最新更新