阅读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);
}
}
虽然看起来不太吸引人。在这种情况下,最不丑的解决方案是什么?
答案 0 :(得分:4)
您不创建子类的解决方案是正确的。这是组合,你应该总是喜欢它而不是继承。因此,即使A
具有正确的构造函数,您也不应该使B
成为A
的子类,除非您有特定的要求强制执行此操作。
仅在需要将B
的实例作为A
的实例传递时才使用继承。但实际上,你应该很少需要这样做,除非你正在处理设计不佳的代码。你应该使用接口,这样你就可以class A
实现一些接口,让我们称之为interface IA
。然后,您可以简单地使用A
而不是class B implements IA
的子类。然后,如果需要,您可以在A
内部使用B
类型的私有成员变量。
(还有关于何时使用接口以及何时使用抽象基类的问题,但我将其排除在此答案之外。)
请注意,现代Java IDE使创建委托非常容易,坦率地说,在没有这种IDE的情况下编写Java是编写Java代码的错误方法。手工编写所有样板文件容易出错,乏味,并且让你无缘无故地讨厌Java。使用现代IDE,首先添加私有成员变量a
,可能将光标放在其上或右键单击它以获取上下文菜单,然后找到"插入代码..."或某些此类选择。从那里找到类似"添加代表......"。然后,您应该只需点击要添加到A
的{{1}}的哪些方法并将其委派给他们。 IDE应该像这样在B
中创建代码。
B
这使得实际上遵循"组合而不是继承"很好很容易。