看完this thread ,我知道在 Java 中不可能分配给 this
。但是有什么解决方法吗?我有以下情况。我正在编写一个子类 B
,但是基类 A
没有任何允许根据我的参数创建对象的显式构造函数或方法。唯一可用的方法是调用一些外部函数 F()
:
public class B extends A {
public B(some args) {
A a = F(some args);
this = a;
}
}
A
和F()
都来自外部库,A
是一个非常复杂的对象,而F()
实现了一个复杂的算法。
我能想到的唯一解决方案就是不创建子类:
public class B {
public A a;
public B(some args) {
a = F(some args);
}
}
虽然看起来不是很吸引人。在这种情况下,最不丑陋的解决方案是什么?
最佳答案
您不创建子类的解决方案是正确的。那就是组合,你应该总是喜欢它而不是继承。所以即使 A
有正确的构造函数,你也不应该让 B
成为 A
的子类,除非你有特定的要求迫使你这样做
仅当您需要将 B
的实例作为 A
的实例传递时才使用继承。但实际上,您应该很少需要这样做,除非您正在处理设计不佳的代码。你应该使用接口(interface),这样你就会有 class A
实现了一些接口(interface),我们称它为 interface IA
。然后不是 A
的子类,而是简单地让 class B implements IA
。如果需要的话,B
中还有 A
类型的私有(private)成员变量。
(还有什么时候使用接口(interface)和什么时候使用抽象基类的问题,但我会把它从这个答案中去掉。)
请注意,现代 Java IDE 使创建委托(delegate)变得非常容易,坦率地说,在没有此类 IDE 的情况下编写 Java 代码是编写 Java 代码的错误方法。手工编写所有样板文件容易出错、乏味,并且会让你无缘无故地讨厌 Java。使用现代 IDE,首先添加私有(private)成员变量 a
,可能将光标放在它上面或右键单击它以显示上下文菜单,然后找到“插入代码...”或类似的选项。从那里找到类似“添加代表...”的内容。然后,您应该能够简单地单击要将 A
的哪些方法添加到 B
并委托(delegate)它们。 IDE 应该像这样在 B
中创建代码。
int method() {
return a.method();
}
这实际上使得遵循“继承之上的组合”变得非常容易。
关于java - 在 Java 中分配给这个的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25574354/