使Java父类不是接口的一部分

Bar*_*lom 4 java theory oop inheritance interface

(这是一个假设的讨论问题,我没有实际问题).

假设我正在SortedSet通过扩展来实现LinkedHashMap:

class LinkedHashSortedMapThing extends LinkedHashMap implements SortedSet {
 ...
}
Run Code Online (Sandbox Code Playgroud)

现在使用这个类的程序员可以这样做

LinkedHashMap x = new LinkedHashSortedMapThing();
Run Code Online (Sandbox Code Playgroud)

但是,如果我考虑扩展LinkedHashMap实现细节,并且不希望它成为类合同的一部分,该怎么办?如果人们使用上面这一行,我就不能再自由地改变这个细节,而不必担心破坏现有的代码.有没有办法防止这种事情,除了支持组合而不是继承(由于私人/受保护的成员,这并不总是可行的)?

Mic*_*zek 11

我认为最简单的方法是创建一个扩展的私有内部类LinkedHashMap,并LinkedHashSortedMapThing保留对它的引用并将其所有方法指向那里.

class LinkedHashSortedMapthing implements SortedSet {
    private class Foo extends LinkedHashMap {
        ...
    }

    private Foo foo;

    public void clear() {foo.clear();}
    public boolean containsValue(Object value) {return foo.containsValue(value);}
    ...
}
Run Code Online (Sandbox Code Playgroud)


Pét*_*rök 7

如果扩展类,则继承其公共接口,并且无法避免此AFAIK.组合确实是有利的解决方案,因为你不应该依赖于内部LinkedHashMap- 这些也可以在未来的JDK版本中改变.

Java没有像C++那样的私有继承(实际上它或多或少等同于组合).