在Java中分配给它的解决方法?

j

读完该线程后,我知道不可能this用Java分配给但是,有什么解决方法吗?我有以下情况。我正在编写一个子类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但是,实际上,除非您要处理设计不良的代码,否则几乎不需要这样做。您应该使用接口,所以您将拥有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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

方法与方法在Java中分配给变量的方法

来自分类Dev

Swift无法在方法中分配给self

来自分类Dev

无法在方法中分配给自己-Swift

来自分类Dev

Swift无法在方法中分配给self

来自分类Dev

在构造函数中分配给* this

来自分类Dev

在F#中分配给Nullable

来自分类Dev

错误:无法在“自身”中分配给“ ...”

来自分类Dev

在结构中分配给结构的语法

来自分类Dev

在Julia中分配给多维数组

来自分类Dev

无法在Python中分配给文字

来自分类Dev

在构造函数中分配给* this

来自分类Dev

在bash脚本中分配给变量

来自分类Dev

将int自己的地址分配给它的值

来自分类Dev

防止拖动的对象离开分配给它的视图

来自分类Dev

ConditionExpression上的“无法分配给它-是只读的”错误

来自分类Dev

TextView不显示分配给它的值

来自分类Dev

无法分配给它-只读-C#

来自分类Dev

反应状态的变化时,分配给它的变量的变化

来自分类Dev

TextView不显示分配给它的值

来自分类Dev

使用Java的三元运算符,将变量分配给它本身意味着什么?

来自分类Dev

使用 java.util.random 1000 次将随机数分配给它受尊重的地方

来自分类Dev

通过数据绑定处理事件与在Activity中分配给方法的onClick进行比较

来自分类Dev

Java 中分配给函数式接口的对象是什么?

来自分类Dev

如何从ipdb中分配给ipython全局命名空间?

来自分类Dev

如何在Sass中分配给全局变量?

来自分类Dev

我在Ruby中分配给$ stdout的对象会怎样?

来自分类Dev

无法在“自身”中分配给“”-在Swift中使用元组

来自分类Dev

区分堆中分配给对象的对象与堆对象

来自分类Dev

VB:在Adobe Illustrator,Photoshop中分配给布尔属性

Related 相关文章

热门标签

归档