gpt4 book ai didi

Java继承与初始化

转载 作者:搜寻专家 更新时间:2023-10-30 21:17:17 24 4
gpt4 key购买 nike

我正在阅读 J. Bloch 的 Effective Java,现在我正在阅读继承与组合部分。据我所知,他说继承并不总是好的。

A related cause of fragility in subclasses is that their superclass can acquire new methods in subsequent releases. Suppose a program depends for its security on the fact that all elements inserted into some collection satisfy some predicate. This can be guaranteed by subclassing the collection and overriding each method capable of adding an element to ensure that the predicate is satisfied before adding the element. This works fine until a new method capable of inserting an element is added to the superclass in a subsequent release.

但为什么它不起作用?父类(super class)只是 Collection 接口(interface),如果我们添加一个新方法,我们只是一个编译时错误。这永远不会有害...

最佳答案

假设您在某个库 v1.0 中有一个 Collection 父类(super class):

public class MyCollection {
public void add(String s) {
// add to inner array
}
}

您将其子类化以便仅接受长度为 5 的字符串:

public class LimitedLengthCollection extends MyCollection {
@Override
public void add(String s) {
if (s.length() == 5) {
super.add(s);
}
}
}

契约,这个类的不变量是它永远不会包含长度不为 5 的字符串。

现在该库的 2.0 版发布了,您可以开始使用它了。基类修改为:

public class MyCollection {
public void add(String s) {
// add to inner array
}

public void addMany(String[] s) {
// iterate on each element and add it to inner array
}
}

并且您的子类保持不变。现在你的子类的用户可以做

LimitedLengthCollection c = new LimitedLengthCollection();
c.addMany(new String[] {"a", "b", "c"});

你的子类的契约就这样被打破了。它应该只接受长度为 5 的字符串,现在不再接受了,因为在父类(super class)中添加了一个额外的方法。

关于Java继承与初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31076008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com