实施的最佳方式是什么;重新定义;Java中的属性?
提前感谢您的阅读 我所说的“重新定义”是UML规范中广泛使用的概念 我的理解是:一个“重定义”属性的类型是“重定义”属性类型的子类。而“重定义”属性的所有者是“重定义”属性所有者的子类 给出以下示例:实施的最佳方式是什么;重新定义;Java中的属性?,java,attributes,redefine,Java,Attributes,Redefine,提前感谢您的阅读 我所说的“重新定义”是UML规范中广泛使用的概念 我的理解是:一个“重定义”属性的类型是“重定义”属性类型的子类。而“重定义”属性的所有者是“重定义”属性所有者的子类 给出以下示例: Duration extends ValueSpecification DurationInterval extends Interval Interval has two attributes typed by ValueSpecification, min and max; DurationI
Duration extends ValueSpecification
DurationInterval extends Interval
Interval has two attributes typed by ValueSpecification, min and max;
DurationInterval has two "redefined" attributes typed by Duration, min and max;
这是我的实现:
Duration extends ValueSpecification
DurationInterval extends Interval
Interval has two attributes typed by ValueSpecification, min and max;
DurationInterval has two "redefined" attributes typed by Duration, min and max;
1) 如果我在DurationInterval中定义了min/max,我将隐藏另一个字段;实际上,这是实现“重定义”属性的最简单方法。有人投票赞成这种实施吗
public Duration min/max;
2) 然后我介绍了“Getter”,很好,它描述了“协变返回类型”,所以这种方法是有效的。
但是,我必须向下转换类型以使其工作
3) 然而,对于“Setters”,如果我添加“@Override”,我将得到错误。我认为这是有争议的;首先,我必须承认,甲骨文明确表示,这不是覆盖。其次,我认为这是“覆盖”,只是Oracle还没有实现它。我错了是因为我不知道他们这样做的原因吗
4) 您在UML的重新定义属性上的实现是什么
public class RedefineProj {
static class ValueSpecification{}
static class Duration extends ValueSpecification{}
static class Interval{
public ValueSpecification min;
public ValueSpecification max;
public ValueSpecification getMin(){
return min;
}
public ValueSpecification getMax(){
return max;
}
public void setMin(ValueSpecification min_){
min = min_;
}
public void setMax(ValueSpecification max_){
max = max_;
}
}
static class DurationInterval extends Interval{
@Override
public Duration getMin(){
return (Duration) min;
}
@Override
public Duration getMax(){
return (Duration)max;
}
public void setMin(Duration min_){
min = min_;
}
public void setMax(Duration max_){
max = max_;
}
}
public static void main(String[] args) {
// TODO code application logic here
Interval i = new Interval();
ValueSpecification v = i.getMax();
DurationInterval di = new DurationInterval();
Duration d = di.getMax();
}
}
最简单的方法是像在第一点中那样重新定义属性
protected Duration min;
protected Duration max;
通过这种方式,可以隐藏父类定义的属性。因为这不是一个真正的重新定义,你必须做更多的工作,以加强他们的类型。为了只接受Duration
对象,必须更改setter方法。您可以这样做:
@Override
public void setMin(ValueSpecification min_)
{
min = (min_ instanceof Duration) ? min_ : min;
}
@Override
public void setMax(ValueSpecification max_)
{
max = (max_ instanceof Duration) ? max_ : max;
}
新的setter方法之所以不重写Interval
中的方法,是因为它们具有不同的参数,因此被视为单独的方法(这个概念称为重载)。在您的代码中,原始setter方法仍然可以在DurationInterval
的对象上调用。另一方面,上面的代码重写父方法并修改它们,以便只接受持续时间输入(其他输入只是被忽略;如果需要,可以抛出异常)
作为旁注:您不应该将属性定义为
public
,因为所有对象都可以直接访问它们,并且可以将它们置于无效状态(例如null、负值等)。始终使用private
,或者如果您希望在具有protected
的子类中可以访问它们,请遵循Java约定,并以小写字母开头方法名称,例如setMin(…)
。大写字母代表班级名称。接受你所有的意见。此外,如果传入的最小值/最大值不是Duration的instanceof,则最小值/最大值保持其原始值或引发异常是有争议的。引入具有显式参数类型的非重写setter,因为“Duration”也是候选参数。无论如何,再等2天,看看是否有更好的解决方案。