Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解';有效的Java';关于比较_Java_Oop_Object_Compareto - Fatal编程技术网

理解';有效的Java';关于比较

理解';有效的Java';关于比较,java,oop,object,compareto,Java,Oop,Object,Compareto,这是关于类可以实现的比较契约 无法使用新值扩展可实例化类 组件,同时将比较器保留为协定,除非 愿意放弃面向对象抽象的好处。相同的 解决方法也适用。如果要将值组件添加到 实现Comparable的类,不要扩展它;写一篇无关的文章 类,该类包含第一个类的实例。然后提供一个“视图” 方法返回此实例。这使您可以自由地实现 在第二个类中,您喜欢的任何比较方法,同时允许 它的客户端将第二个类的实例视为 需要的时候第一节课 我读过。它帮助我回答了一两个问题,但下面的问题我仍然没有回答 1) 如果我将这两个类定

这是关于类可以实现的比较契约

无法使用新值扩展可实例化类 组件,同时将比较器保留为协定,除非 愿意放弃面向对象抽象的好处。相同的 解决方法也适用。如果要将值组件添加到 实现Comparable的类,不要扩展它;写一篇无关的文章 类,该类包含第一个类的实例。然后提供一个“视图” 方法返回此实例。这使您可以自由地实现 在第二个类中,您喜欢的任何比较方法,同时允许 它的客户端将第二个类的实例视为 需要的时候第一节课

我读过。它帮助我回答了一两个问题,但下面的问题我仍然没有回答

1) 如果我将这两个类定义为不相关的,我可以随意实现compareTo方法。同意。但我如何使这两个类具有is-a/父-子关系。有人能解释Joshua称之为“视图”的方法吗

有人能解释约书亚所谓的“视图”方法吗

我将继续Jon Skeet的简单示例:

“提供视图”而不是“扩展”将意味着像这样设计类层次结构:

class NamedThing {
    String name;
}

class Person {
    private  NamedThing namedThing;
    // Here is the view method
    public NamedThing asNamedThing() {
        return namedThing;
    }
    // Here is a convenience method for accessing name directly
    public String getName() {
        return namedThing.name;
    }
    Date dateOfBirth;
}
这使您可以在
Person
内部实现新的
比较,因为不需要与超类保持兼容。如果您需要将您的个人视为
NamedThing
,请调用
asNamedThing()


请注意,由于这不是一种is-a关系,
asNamedThing
有些误导性:你在人里面得到的是命名的东西,而不是碰巧是命名的东西的人。这就限制了
compareTo
:例如,你不能在其他
命名的事物中对人进行排序。

你不能,这就是重点。你实现了一个has-a关系。@JBNizet你应该对你的评论进行一点扩展,并将其作为答案发布。我想不出用这种方法做以下事情的方法。NamedThing thing=新人()。你是说这种语法在创建person对象时不可能使用这种方法吗?@AnushaPachunuri正确,这是这种方法的一个结果。你需要做
Person p=newperson();NamedThing personshing=p.asNamedThing(),我仍然可以按原样使用所有多态性概念?比如说方法重写中的动态绑定?它们仍然是可以实现的,对吗?@AnushaPachunuri不,我认为这就是Joshua试图表达的观点:不要扩展
可比较的
类来增加价值成分,让类保持原样。这些新类和它们包含的
可比较的
类不会有多态性。
class NamedThing {
    String name;
}

class Person {
    private  NamedThing namedThing;
    // Here is the view method
    public NamedThing asNamedThing() {
        return namedThing;
    }
    // Here is a convenience method for accessing name directly
    public String getName() {
        return namedThing.name;
    }
    Date dateOfBirth;
}