如何在Java中分配给它?

如何在Java中分配给它?,java,inheritance,this,subclass,Java,Inheritance,This,Subclass,阅读后,我了解到在Java中不可能将分配给此。但是有什么解决办法吗?我有以下情况。我正在编写一个子类B,但是基类a没有任何显式构造函数或方法,允许在给定参数的情况下创建对象。唯一可用的方法是调用一些外部函数F(): A和F()都来自外部库,A是一个非常复杂的对象,F()实现了一个复杂的算法 我能想到的唯一解决方案就是不创建子类: public class B { public A a; public B(some args) { a = F(some a

阅读后,我了解到在Java中不可能将
分配给此
。但是有什么解决办法吗?我有以下情况。我正在编写一个子类
B
,但是基类
a
没有任何显式构造函数或方法,允许在给定参数的情况下创建对象。唯一可用的方法是调用一些外部函数
F()

A
F()
都来自外部库,
A
是一个非常复杂的对象,
F()
实现了一个复杂的算法

我能想到的唯一解决方案就是不创建子类:

public class B {
   public A a;   
   public B(some args) {     
       a = F(some args);      
   }
}

但它看起来不太吸引人。在这种情况下,最不丑陋的解决方案是什么

您不创建子类的解决方案是正确的。这就是组合,你应该总是喜欢它而不是继承。因此,即使
A
拥有正确的构造函数,您也不应该将
B
作为
A
的子类,除非您有特定的需求迫使您这样做

仅当需要将
B
的实例作为
A
的实例传递时才使用继承。但实际上,除非您处理的是设计糟糕的代码,否则很少需要这样做。您应该使用接口,因此您将拥有实现某些接口的
类A
,我们称之为
接口IA
。然后,不再是
A
的子类,而是简单地让
类B实现IA
。然后,如果需要的话,在
B
中有
A
类型的私有成员变量

(还有什么时候使用接口和什么时候使用抽象基类的问题,但我不在回答这个问题。)


请注意,现代JavaIDE使创建委托变得非常容易,坦率地说,在没有这样的IDE的情况下编写Java是编写Java的错误方式。手工编写所有的样板文件都是容易出错的、乏味的,而且会让您无缘无故地讨厌Java。使用现代IDE,首先添加私有成员变量
a
,可能将光标放在其上或右键单击其进入上下文菜单,然后找到“插入代码…”或类似选项。从那里可以找到类似“添加代理…”的内容。然后,您只需单击要添加到
B
中的
A
的哪些方法,并将其委派。IDE应该像这样在
B
中创建代码

int method() {
    return a.method();
}

这使得实际上遵循“组合重于继承”非常好和容易。

但是基类A没有任何显式的构造函数或方法,允许在给定参数的情况下创建对象。
似乎是出于设计。不要试图破坏封装,使用组合而不是继承。难道不可能用超级构造函数所需的任何数据来参数化B的构造函数吗?@SotiriosDelimanolis:这应该是答案的一部分。如果B真的扩展了A,为什么需要任何转换?换句话说,F()会做什么,你不能简单地用一个
actLikeA
flag@Gus,B确实扩展了A。至少应该是这样。这个问题来自化学信息学领域。类是指一些分子结构,包括所有的化学元素、键、3D结构等。F()从它的字符串表示返回一个分子。我不知道这个算法是如何工作的,它超出了我的专业范围。我只是想用更多的自定义属性和方法来扩展它。谢谢!这并不完全是我所希望的,但在这一点上,这似乎是唯一的办法。
int method() {
    return a.method();
}