首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多态设计故障

多态设计故障
EN

Stack Overflow用户
提问于 2015-11-30 16:29:59
回答 1查看 94关注 0票数 0

背景:

我有四个类,代表一个度量单位:毫米,英寸,像素,FootAndInch。

每个类都是BigDecimal的包装类,每个类都有相同的方法子集:

代码语言:javascript
复制
...
add(BigDecimal value)
divide(BigDecimal value)
multiple(BigDecimal value)
subtract(BigDecimal value)
...

在每个单独的类中重复相同的方法似乎很乏味。因此,我创建了一个抽象类(称为"Unit"),希望只需要编写每个方法一次,并使用多态:

代码语言:javascript
复制
public abstract class Unit {

BigDecimal value;

public Unit(BigDecimal value) {
    this.value = value;
}
public Unit(int value) {
    this.value = new BigDecimal(value);
}
public Unit(String value) {
    this.value = new BigDecimal(value);
}
public Unit(Unit unit) {
    this.value = unit.bigDecimal();
}

public abstract Unit add(int value);
public abstract Unit add(int value, MathContext mathContext);
public abstract Unit add(Unit value);
public abstract Unit add(Unit value, MathContext mathContext);   
public abstract Unit add(BigDecimal value);
public abstract Unit add(BigDecimal value, MathContext mathContext);

public abstract Unit divide(Unit value, MathContext mathContext);
public abstract Unit divide(int value, MathContext mathContext);
public abstract Unit divide(BigDecimal value, MathContext mathContext);

public abstract Unit[] divideAndRemainder(Unit value, MathContext mathContext);

public abstract Unit multiply(BigDecimal value);   
public abstract Unit multiply(BigDecimal value, MathContext mathContext);
public abstract Unit multiply(int value);
public abstract Unit multiply(int value, MathContext mathContext);
public abstract Unit multiply(Unit value);
public abstract Unit multiply(Unit value, MathContext mathContext);    

public abstract Unit negate();
public abstract Unit plus();
public abstract Unit remainder(Unit value, MathContext mathContext);

public abstract Unit subtract(int value);
public abstract Unit subtract(int value, MathContext mathContext);
public abstract Unit subtract(Unit value);
public abstract Unit subtract(Unit value, MathContext mathContext);   
public abstract Unit subtract(BigDecimal value);
public abstract Unit subtract(BigDecimal value, MathContext mathContext); 

public double doubleValue() {
    return value.doubleValue();
}    
public float floatValue() {
    return value.floatValue();
}    
public int intValue() {
    return value.intValue();
}
public BigDecimal bigDecimal() {
    return value;
}

@Override public abstract String toString();    
}

现在,Mm,Inch,Pixel,FootAndInch每个扩展单元

问题:下面的语句显示了一个错误:

代码语言:javascript
复制
Mm value1 = new Mm(1000);
Mm result = value1.divide(new Mm(10), new MathContext(10, RoundingMode.CEILING));

“不兼容类型:单元不能转换为Mm”。

我理解这个错误,但是我不知道如何重新排列我的代码,这样我只编写了一次方法。有什么建议吗?

编辑:只是为了澄清,Unit方法是在Unit中实现的。我没有让他们试着缩短这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-30 16:41:01

我看到了两个选项:要么只创建一个为度量类型保留int和enum的类(不需要多态)。或者将Unit转换为泛型超类单元,并使所有抽象函数返回类型T,然后将Mm定义为Mm类扩展单元。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34003323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档