我有三个班级(A班,B班和C班)。
A类调用B的实例并运行start()。
B类扩展了Thread,所以当调用start()时,run()方法中的任何东西都会被执行。
在run()线程中,有一个C类实例。
是否有允许C类中的方法调用A类中的方法,而不实例化A类的新实例?
由于我不能将A类扩展到B类(因为“Thread”已经扩展),我不知道我该如何做到这一点。
很抱歉模糊,但我的项目功能太多,而且太复杂,无法提供直接的代码示例。
谢谢!
答案 0 :(得分:1)
最好的方法可能是B类开始重载以获取参数(A,或更好的是,A实现的接口)。那么B可以存储它以供C检索(如果它是一个内部类)或者将它传递给C的构造函数......
编辑:
虽然提到覆盖构造函数的评论者会起作用,但它不符合问题的参数,这些参数的表达方式已经存在B,所以我的建议是重载start(),如下所示: / p>
b.start(A aParam) {
a=aParam;
start();
}
但是,此版本不是线程安全的。如果B实际上每次都被实例化,或者如果在b启动时实例化C,则B的构造函数可以工作,然后它可以在实例化时传递给C的构造函数。
顺便说一下,由于很多原因,扩展线程通常不如实现runnable好。
答案 1 :(得分:1)
这是一个循环的依赖,在我的(适度的)意见中OOP是一件非常糟糕的事情。
您必须重构代码以提供A和C的公共类。
答案 2 :(得分:1)
所以你有
class A {
void run()
{
new B().start();
}
}
class B extends Thread {
public void run(){
C c = new C();
c.do something with A .. }
}
你可以传递调用者,因为你必须将A一直传递到C到B:
class A {
void run()
{
new B(this).start();
}
}
class B extends Thread {
public void run(A a){
C c = new C();
c.do something(a)..
}
}
或简化,特别是如果B和C没有其他理由:
class A {
public void run()
{
this.do something() ...
}
}
答案 3 :(得分:0)
在java中使用线程行为的另一种方法是实现Runnable。可以想象,您可以扩展A,并实现Runnable,并使用:
Thread t = new Thread( b )
t.start();
从OOP的角度看似丑陋,但在某些情况下可能会有意义。其他两个答案似乎更合理,但认为这可以考虑。