Java:具有方法变体的类

时间:2015-12-20 02:16:29

标签: java class methods

有没有办法创建一个具有可以随该对象的每个实例更改的方法的类?

我想要使用的是一个名为Dice的类,其方法为roll(int s),它返回从1到s的随机数,有没有办法让它成为可能因此,Dice的{​​{1}}变体的其他实例(例如加权骰子)仅返回数字>或者< 不是继承或接口的roll(int s)等的一半?

编辑:我并不反对使用继承,我只是更喜欢一个更简洁的版本,它没有10个以上的s和{{1}略有不同的类方法是唯一的区别

2 个答案:

答案 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);