具有默认值的抽象类

比利时的

我试图定义一个抽象的Range类,它将作为许多Range类的基础实现。预期用途与该问题无关,但到目前为止,我有:

/**
 * Abstract generic utility class for handling ranges
 */
public abstract class Range<T extends Number> {

  // Variables to hold the range configuration
  private T start;
  private T stop;
  private T step;

  /**
   * Constructs a range by defining it's limits and step size.
   *
   * @param start The beginning of the range.
   * @param stop The end of the range.
   * @param step The stepping
   */
  public Range(T start, T stop, T step) {
    this.start = start;
    this.stop = stop;
    this.step = step;
  }
}

现在,我想添加一个仅包含start的构造函数stop,并设置默认的步长值1,无论Number Tis的实现什么(例如ifT是否Integer [one]具有该值1,if TisLong [one]是否具有该值1L,依此类推)。我想要类似的东西:

protected Range(T start, T stop) {
  this(start, stop, [one]);
}

但我不知道如何设置的值[one]由于Java对我来说仍然相当陌生,因此我尝试了以下方法:

private static final T one = 1;

这是行不通的,因为T显然是在的实例化中定义的Range.this我也尝试过:

protected static abstract T getOne();

这是因为还没有工作T在的实例定义Range.thisstaticabstract不一起工作。

我需要某种方法来扩展类,[one]无论执行何种实现,Number Range必须强制定义其值

最终,我还想将零值设置为默认开始,这样我就得到了一个如下所示的构造函数:

protected Range(T stop) {
  this([zero], stop, [one]);
}
sp00m

一种解决方案是向子类询问要使用的默认步骤:

public abstract class Range<T extends Number> {

    private T start;
    private T stop;
    private T step;

    public Range(T start, T stop, T step) {
        this.start = start;
        this.stop = stop;
        this.step = step;
    }

    protected Range(T start, T stop) {
        this.start = start;
        this.stop = stop;
        this.step = getDefaultStep();
    }

    protected abstract T getDefaultStep();

}

public class IntegerRange extends Range<Integer> {

    public IntegerRange(Integer start, Integer stop, Integer step) {
        super(start, stop, step);
    }

    public IntegerRange(Integer start, Integer stop) {
        super(start, stop);
    }

    @Override
    protected Integer getDefaultStep() {
        return 1;
    }

}

public class DoubleRange extends Range<Double> {

    public DoubleRange(Double start, Double stop, Double step) {
        super(start, stop, step);
    }

    public DoubleRange(Double start, Double stop) {
        super(start, stop);
    }

    @Override
    protected Double getDefaultStep() {
        return 1d;
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

抽象类指针参数的默认值

来自分类Dev

抽象类中的 ModelAttribute 具有来自子类的值

来自分类Dev

在目标C中实现抽象类时,请设置BOOL的默认值TRUE

来自分类Dev

在目标C中实现抽象类时,请设置BOOL的默认值TRUE

来自分类Dev

具有@XmlTransient的JAXB抽象类

来自分类Dev

具有类默认值的模板参数

来自分类Dev

具有类继承的kwargs中的默认值

来自分类Dev

仅具有抽象方法的抽象类

来自分类Dev

仅具有抽象方法的抽象类

来自分类Dev

Junit测试具有抽象类对象的类

来自分类Dev

C#抽象类具有另一个抽象类对象

来自分类Dev

抽象类是否可以具有其他抽象类的返回类型的方法?

来自分类Dev

为什么即使我的抽象类具有受保护的构造函数,也要创建默认构造函数?

来自分类Dev

具有隐藏构造函数的抽象类的实例

来自分类Dev

具有自定义注释的抽象类

来自分类Dev

具有抽象类的静态块的行为

来自分类Dev

具有抽象类实现接口的AutoConfiguredMoqCustomization

来自分类Dev

测试具有静态属性的抽象类

来自分类Dev

Django:具有meta的抽象类的多重继承

来自分类Dev

剂量抽象类具有属性吗?

来自分类Dev

Scala中具有构造函数参数的抽象类

来自分类Dev

具有通用列表的Java抽象类

来自分类Dev

具有实现的继承的抽象类的继承

来自分类Dev

具有工厂构造函数的抽象类的好处?

来自分类Dev

动态调用-具有接口和抽象类的Java

来自分类Dev

phpunit中具有受保护方法的抽象类

来自分类Dev

C ++ / Qt中具有泛型的抽象类

来自分类Dev

具有自定义批注的抽象类

来自分类Dev

具有两个抽象类的继承