gpt4 book ai didi

java - 在 Java 中分配给这个的解决方法?

转载 作者:搜寻专家 更新时间:2023-11-01 02:44:39 25 4
gpt4 key购买 nike

看完this thread ,我知道在 Java 中不可能分配给 this。但是有什么解决方法吗?我有以下情况。我正在编写一个子类 B,但是基类 A 没有任何允许根据我的参数创建对象的显式构造函数或方法。唯一可用的方法是调用一些外部函数 F():

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

AF() 都来自外部库,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com