为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红颜莎娜 2023-06-08 20:47:37
我有一个设计问题。我试着写一个角色扮演游戏,让巫师互相战斗。他们通过施法互相对抗。我决定为所有法术创建一个抽象超类。基本上,一个咒语是一个有名字的对象(例如火球),知道它的巫师(通过巫师值确定咒语的强度)并且必须施放咒语,所以它应该有一个抽象方法“cast ”。public abstract class Spell {    private String name;    private Sorcerer sorcerer;    public abstract void cast();}但是现在我有一个问题:我无法规范这个方法的方法签名,因为不同的咒语需要不同的参数并且可能有不同的返回值。治疗施法可以治疗巫师并且可能不需要参数。但是例如火球法术需要一个敌人作为参数。我将不得不为法术定义不同的基类。这可能会导致爆炸式的类层次结构。有没有办法定义某种“海绵方法”来重载?或者有更好的方法来解决这个问题吗?
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

一种方法是使用可变参数。假设一个法术只能由一个巫师施展,它看起来像这样:


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 类。


查看完整回答
反对 回复 2023-06-08
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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



查看完整回答
反对 回复 2023-06-08
  • 2 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信