0

我有三个班级(A级,B级和C级)。

A 类调用 B 的一个实例并运行 start()。

B 类扩展了 Thread,所以当 start() 被调用时,run() 方法中的任何东西都会被执行。

在 run() 线程中,有一个 C 类的实例。

无论如何,是否允许 C 类中的方法调用 A 类中的方法,而不实例化 A 类的新实例?

由于我不能将 A 类扩展到 B 类(因为“线程”已经被扩展),我不知道该怎么做。

抱歉含糊不清,但我的项目包含太多代码,而且太复杂,无法提供直接的代码示例。

谢谢!

4

4 回答 4

1

最好的方法可能是让 B 类开始重载以获取参数(A,或者更好的是,由 A 实现的接口)。然后 B 可以存储它以供 C 检索(如果它是内部类)或将其传递给 C 的构造函数...

编辑:

尽管评论者提到重写构造函数会起作用,但它不符合问题的参数,该问题的措辞 B 已经存在,所以我的建议是像这样重载 start() :

b.start(A aParam) {
    a=aParam;
    start();
}

然而,这个版本不是线程安全的。如果每次都实际实例化 B,或者如果在 b 启动时实例化 C,则 B 的构造函数可以工作,那么它可以在实例化时传递给 C 的构造函数。

顺便说一句,由于很多原因,扩展线程通常不如实现 runnable 好。

于 2009-08-05T18:53:19.497 回答
1

这是一个循环依赖,在我(谦虚的)看来,这在 OOP 中是一件非常糟糕的事情。

您必须重构代码以提供 A 和 C 的公共类。

于 2009-08-05T18:53:22.537 回答
1

所以你有了

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() ... 
 }
}
于 2009-08-05T19:04:57.523 回答
0

在 java 中利用线程行为的另一种方法是实现 Runnable。可以想象,您可以扩展 A,并实现 Runnable,然后使用:

Thread t = new Thread( b )
t.start();

从 OOP 的角度来看似乎很难看,但可以想象在某些情况下它是有意义的。其他两个答案似乎更明智一些,但认为可以考虑这一点。

于 2009-08-05T19:04:00.597 回答