Java扩展/抽象/实现问题
我有三个班(A班、B班和C班) 类A调用B的实例并运行start() 类B扩展了线程,因此当调用start()时,run()方法中的任何内容都将被执行 在run()线程中,有一个类C的实例 是否允许类C中的方法调用类a中的方法,而不实例化类a的新实例 因为我不能将类A扩展到类B(因为“线程”已经被扩展了),所以我不知道该怎么做 很抱歉说得含糊不清,但我的项目有太多的代码,而且太复杂,无法提供直接的代码示例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实现的接口)。
谢谢 最好的方法可能是重载类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()不会有什么好处。太好了,谢谢!自始至终都有很多很好的建议,但由于时间有限,对于一些设计拙劣且过于复杂的东西来说,这是最简单的修复方法。太好了,谢谢!自始至终都有很多很好的建议,但由于时间有限,对于一些设计拙劣、过于复杂的东西来说,这是最简单的修复方法。