Java扩展/抽象/实现问题

Java扩展/抽象/实现问题,java,class,implementation,abstraction,Java,Class,Implementation,Abstraction,我有三个班(A班、B班和C班) 类A调用B的实例并运行start() 类B扩展了线程,因此当调用start()时,run()方法中的任何内容都将被执行 在run()线程中,有一个类C的实例 是否允许类C中的方法调用类a中的方法,而不实例化类a的新实例 因为我不能将类A扩展到类B(因为“线程”已经被扩展了),所以我不知道该怎么做 很抱歉说得含糊不清,但我的项目有太多的代码,而且太复杂,无法提供直接的代码示例 谢谢 最好的方法可能是重载类B的start以获取参数(a,或者更好的是,由a实现的接口)。

我有三个班(A班、B班和C班)

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

类B扩展了线程,因此当调用start()时,run()方法中的任何内容都将被执行

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

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

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

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


谢谢

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

编辑:

尽管正如评论员所提到的,重写构造函数是可行的,但它不符合问题的参数,问题的措辞方式是B已经存在,因此我的建议是像这样重载start():

b.start(A aParam) {
    a=aParam;
    start();
}
但是,此版本不是线程安全的。如果B每次都被实例化,或者如果C在B启动时被实例化,那么B的构造函数可以工作,然后它可以在实例化时传递给C的构造函数


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

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

编辑:

尽管正如评论员所提到的,重写构造函数是可行的,但它不符合问题的参数,问题的措辞方式是B已经存在,因此我的建议是像这样重载start():

b.start(A aParam) {
    a=aParam;
    start();
}
但是,此版本不是线程安全的。如果B每次都被实例化,或者如果C在B启动时被实例化,那么B的构造函数可以工作,然后它可以在实例化时传递给C的构造函数


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

这是一种循环依赖,在我(适度)看来,在OOP中是一件非常糟糕的事情


你必须重构你的代码,为a和C提供一个公共类。

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


您必须重构代码,为a和C提供一个公共类。

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

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

从面向对象的角度来看,它看起来很难看,但在某些情况下,它可能是有意义的。另外两个答案似乎更合理,但我认为这是可以考虑的。

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

Thread t = new Thread( b )
t.start();
从面向对象的角度来看,它看起来很难看,但在某些情况下,它可能是有意义的。其他两个答案似乎更合理,但我认为这是可以考虑的。

所以你有了答案

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() ... 
 }
}
你有吗

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() ... 
 }
}

我相信你的意思是“B类的构造函数”。重写Thread.start()不会有多大好处。我肯定你的意思是“类B的构造函数”。重写Thread.start()不会有什么好处。太好了,谢谢!自始至终都有很多很好的建议,但由于时间有限,对于一些设计拙劣且过于复杂的东西来说,这是最简单的修复方法。太好了,谢谢!自始至终都有很多很好的建议,但由于时间有限,对于一些设计拙劣、过于复杂的东西来说,这是最简单的修复方法。