我正在看一本书《用java思考》它声明了内部类的以下内容:
每个内部类都可以独立地继承实现。因此,看待内部类的一种方法是将其视为多重继承问题的其余解决方案。接口解决了部分问题,但是内部类有效地允许多个实现inheritance"。也就是说,内部类有效地允许您从多个非接口继承。
我从来没有使用过这样的内部类。所以我开始思考它会是什么样子以及它在哪里有用。我想到了这个:
public class ReadWriteCollection {
public static void main(String[] args) {
var rw = new ReadWriteCollection();
var ro = rw.new ReadPart();
var ao = rw.new AddPart();
ao.add("foo");
System.out.println(ro.read(0));
}
private List<String> list = new ArrayList<>();
class AddPart extends AddOnlyCollection {
void add(String s) { list.add(s); }
}
class ReadPart extends ReadOnlyCollection {
String read(int index) { return list.get(index); }
}
public abstract static class ReadOnlyCollection {
final void someExistingImplementation(){ System.out.println("Foo"); }
abstract String read(int index);
}
public abstract static class AddOnlyCollection {
final void someExistingImplementation(){ System.out.println("Bar"); }
abstract void add(String s);
}
}
ReadOnlyCollection
和AddOnlyCollection
代表了一些我无法控制的现有实现。我把它们放在ReadWriteCollection
中只是为了方便在我的例子中。
那么,内部类应该如何用于"多重实现继承"?谁能给出更多的例子和可能的用法?或者是过去使用内部类的方式,现在不再这样使用了(这本书很旧了)?
我猜作者的想法是下面绕过Java中的多继承限制:
public class A {}
public class B {}
public class C {}
public class MainTest {
private AA aa;
private BB bb;
private CC cc;
public static void main(String[] args) {
AA aa = new AA();
BB bb = new BB();
CC cc = new CC();
}
private static class AA extends A {
}
private static class BB extends B {
}
private static class CC extends C {
}
}
在MainTest
中扩展了三个不同的类。