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