具有不确定方法签名的抽象方法
Abstract method with indeterminably method signature
我有一个设计问题。我试着写一个角色扮演游戏,让巫师互相战斗。他们通过施法互相对抗。我决定为所有法术制作一个抽象超级class。
基本上,法术是一个有名字的物体(例如火球),知道它的巫师(通过巫师值确定法术的强度)并且必须施放法术,所以它应该有抽象方法 "cast".
public abstract class Spell {
private String name;
private Sorcerer sorcerer;
public abstract void cast();
}
但现在我遇到了一个问题:我无法将这个方法的方法签名标准化,因为不同的法术需要不同的参数并且可能有不同的return值。治疗施法可以治疗巫师并且可能不需要参数。但是例如火球法术需要一个敌人作为参数。我将不得不为法术定义不同的 base-classes。这可能会导致爆炸性的 class 层次结构。
有没有办法定义某种 "spongy methods" 来重载?或者有更好的方法解决这个问题吗?
void cast(Sorcerer source, Targetable target)
怎么样?
你可以 spell.cast(myself, myself)
治疗或 spell.cast(myself, enemyPositionOrWhatever)
.
一种方法是使用可变参数。假设一个法术只能由一个巫师施展,它看起来像这样:
public abstract class Spell {
private String name;
public abstract void cast(Sorcerer sorcerer, Target... targets);
}
cast 方法接受 1 个巫师和 0 个或更多目标(更多关于 https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html#varargs 上的可变参数)。
更好的方法
通过查看示例,似乎总是有一个巫师与一个法术相关联,该法术被保存到 class 变量 sorcerer(施放法术的角色)。通过为那个巫师创建一个 getter,可以进一步简化 cast
方法签名:
public abstract class Spell {
private String name;
private Sorcerer sorcerer;
public Sorcerer getSorcerer() {
return sorcerer;
}
public abstract void cast(Target... targets);
}
这样仍然可以从子 classes 访问魔法师,但它不是 cast
方法签名的一部分。
如果我理解正确,该方法还应该支持不同的 return 类型。实现此目的的一种方法是创建一个 class(例如 SpellConsequence),它可以包含不同的值和类型。这样 SpellConsequence class 可以从 cast 方法 returned。
我有一个设计问题。我试着写一个角色扮演游戏,让巫师互相战斗。他们通过施法互相对抗。我决定为所有法术制作一个抽象超级class。
基本上,法术是一个有名字的物体(例如火球),知道它的巫师(通过巫师值确定法术的强度)并且必须施放法术,所以它应该有抽象方法 "cast".
public abstract class Spell {
private String name;
private Sorcerer sorcerer;
public abstract void cast();
}
但现在我遇到了一个问题:我无法将这个方法的方法签名标准化,因为不同的法术需要不同的参数并且可能有不同的return值。治疗施法可以治疗巫师并且可能不需要参数。但是例如火球法术需要一个敌人作为参数。我将不得不为法术定义不同的 base-classes。这可能会导致爆炸性的 class 层次结构。
有没有办法定义某种 "spongy methods" 来重载?或者有更好的方法解决这个问题吗?
void cast(Sorcerer source, Targetable target)
怎么样?
你可以 spell.cast(myself, myself)
治疗或 spell.cast(myself, enemyPositionOrWhatever)
.
一种方法是使用可变参数。假设一个法术只能由一个巫师施展,它看起来像这样:
public abstract class Spell {
private String name;
public abstract void cast(Sorcerer sorcerer, Target... targets);
}
cast 方法接受 1 个巫师和 0 个或更多目标(更多关于 https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html#varargs 上的可变参数)。
更好的方法
通过查看示例,似乎总是有一个巫师与一个法术相关联,该法术被保存到 class 变量 sorcerer(施放法术的角色)。通过为那个巫师创建一个 getter,可以进一步简化 cast
方法签名:
public abstract class Spell {
private String name;
private Sorcerer sorcerer;
public Sorcerer getSorcerer() {
return sorcerer;
}
public abstract void cast(Target... targets);
}
这样仍然可以从子 classes 访问魔法师,但它不是 cast
方法签名的一部分。
如果我理解正确,该方法还应该支持不同的 return 类型。实现此目的的一种方法是创建一个 class(例如 SpellConsequence),它可以包含不同的值和类型。这样 SpellConsequence class 可以从 cast 方法 returned。