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

标签 java inheritance this subclass

看完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/

相关文章:

Java 输入/输出扫描器类和交互面板

java - 如何在独立的 Java 代码中读取 Parquet 文件?

java - 如何在java中包装类并保存接口(interface)?

c# - 使用 [StructLayout(LayoutKind.Sequential)] 解码时 C# 在哪里存储结构的 vtable

java - Spring Boot 不替换 application.properties 文件中的环境变量

java - 在数组中搜索元素,然后返回带有索引的新数组

python - 理解 Python 中的 super

javascript - 对 `this` 关键字的混淆

javascript - 从 this.parent 获取 ID

javascript - 为什么会出现 "this"行为?