有没有办法创建一个具有可以随该对象的每个实例更改的方法的类?
我想要使用的是一个名为Dice
的类,其方法为roll(int s)
,它返回从1到s
的随机数,有没有办法让它成为可能因此,Dice
的{{1}}变体的其他实例(例如加权骰子)仅返回数字>或者< 不是继承或接口的roll(int s)
等的一半?
编辑:我并不反对使用继承,我只是更喜欢一个更简洁的版本,它没有10个以上的s
和{{1}略有不同的类方法是唯一的区别
答案 0 :(得分:2)
使用功能对象
public class Dice {
final BiFunction<Random, Integer, Integer> roll;
final Random random = new Random();
public Dice(BiFunction<Random, Integer, Integer> roll) {
this.roll = roll;
}
public Dice() {
this((r, n) -> r.nextInt(n) + 1);
}
public int roll(int n) {
return roll.apply(random, n);
}
}
public static void main(String[] args) {
Dice normal = new Dice();
Dice alwaysTwo = new Dice((r, n) -> 2);
Dice gaussian = new Dice((r, n) -> (r.nextInt(n) + r.nextInt(n) + 2) / 2);
}
答案 1 :(得分:0)
继承将是首选方式,但正如您所要求的那样:
您可以将变体存储在Dice
的成员变量中,并在构造函数中或通过名为setVariation(DICE_VARIATiON variation)
的自己的函数进行设置。
所以每个Dice
对象都会记住骰子应该如何处理。
enum DICE_VARIATION{ NORMAL, LOW_HALF, HIGH_HALF }
public class Dice
{
private DICE_VARIATION _variation;
public Dice(DICE_VARIATION variation)
{
_variation = variation;
}
public int roll(int s)
{
switch(_variation)
{
case DICE_VARIATION.NORMAL:
return /*normal random return*/
case DICE_VARIATION.LOW_HALF:
return /*random return from 1 to s/2*/
case DICE_VARIATION.HIGH_HALF:
return /*random return from s/2 to s*/
}
return -1;
}
}
您可以创建一些对象,例如new Dice(DICE_VARIATION.NORMAL);
或new Dice(DICE_VARIATION.LOW_HALF);