Java扩展/抽象/实现问题
-
22-07-2019 - |
题
我有3个班级(A级,B级和C级)。
A类调用B的一个实例并运行start()。
B类扩展了Thread,因此在调用start()时,将执行run()方法中的所有内容。
在run()线程中,有一个类C的实例。
无论如何,是否允许C类中的方法调用A类中的方法而无需实例化A类的新实例?
由于我无法将A类扩展到B类(因为“ Thread”已经扩展),所以我不知道该怎么做。
很抱歉,我的项目含糊不清,但是我的项目功能太多,太复杂了,无法提供直接的代码示例。
谢谢!
解决方案
所以你有 通用标签
您可以传递调用者,这可能很难看,因为您必须将A一直通过B传递到C: 通用标签
或简化,特别是如果B和C没有其他理由: 通用标签
其他提示
这是一个循环依赖关系,以我(谦虚)的观点,这在OOP中是一件非常糟糕的事情。
您必须重构代码以提供A和C的通用类。
最好的方法可能是让类B的开始开始重载以获取参数(A,或者更好的是,由A实现的接口)。然后B可以将其存储以供C检索(如果它是一个内部类),或者将其传递给C的构造函数...
编辑:
尽管评论者提到了重写构造函数将起作用,但它不适合以B已经存在的方式表达的问题参数,因此我的建议是像这样重载start():/ p> 通用标签
此版本不是线程安全的。如果B每次实际上都被实例化,或者C在b启动时被实例化,则B的构造函数可以工作,那么它可以在实例化时传递给C的构造函数。
顺便说一句,由于许多原因,扩展线程通常不如实现可运行线程好。
在Java中利用线程行为的另一种方法是实现Runnable。可以想象,您可以扩展A,实现Runnable,并使用: 通用标签
从OOP的角度看,这看起来很丑陋,但是在某些情况下,这可能是合理的。其他两个答案似乎更合理,但认为可以考虑。