读完该线程后,我知道不可能this
用Java分配给。但是,有什么解决方法吗?我有以下情况。我正在编写一个子类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
。但是,实际上,除非您要处理设计不良的代码,否则几乎不需要这样做。您应该使用接口,所以您将拥有class A
实现某些接口的接口,我们称它为interface IA
。这样A
,您就不必拥有它的子类了class B implements IA
。然后,如果需要,您可以在类型A
内部包含私有成员变量B
。
(还有何时使用接口以及何时使用抽象基类的问题,但我将其排除在此答案之外。)
请注意,现代Java IDE使得创建委托非常容易,并且坦率地说,没有这种IDE的Java编码是错误的Java编码方式。手工编写所有样板文件都容易出错,乏味,并且使您无缘无故地讨厌Java。使用现代IDE,首先添加该私有成员变量a
,可能将光标放在其上或右键单击以打开上下文菜单,然后找到“插入代码...”或某些此类选项。从那里找到类似“添加代表...”的内容。然后,您只需单击A
要添加的方法B
并委派它们即可。IDE应该这样创建代码B
。
int method() {
return a.method();
}
这实际上使遵循“继承之上的组成”非常好用和容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句