Java扩展/抽象/实现问题

时间:2009-08-05 18:50:05

标签: java class implementation abstraction

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

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

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

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

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

由于我不能将A类扩展到B类(因为“Thread”已经扩展),我不知道我该如何做到这一点。

很抱歉模糊,但我的项目功能太多,而且太复杂,无法提供直接的代码示例。

谢谢!

4 个答案:

答案 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的角度看似丑陋,但在某些情况下可能会有意义。其他两个答案似乎更合理,但认为这可以考虑。