实施的最佳方式是什么;重新定义;Java中的属性?

实施的最佳方式是什么;重新定义;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

提前感谢您的阅读

我所说的“重新定义”是UML规范中广泛使用的概念

我的理解是:一个“重定义”属性的类型是“重定义”属性类型的子类。而“重定义”属性的所有者是“重定义”属性所有者的子类

给出以下示例:

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天,看看是否有更好的解决方案。