我不太擅长CS域语言,所以我希望我能让自己被理解。
我正在寻找一种DRY方法来创建基于boolean
标志的两种类型中的对象。这两种类型各有一个方法,名称不同,实现相同的逻辑。这个逻辑我只想实现一次(想想这里的抽象超类,但我认为它在这种情况下不起作用)。
示例
更具体地说,考虑一下这一点。有两个类(在我的例子中,一个继承自org.eclipse.core.runtime.jobs.Job
,另一个继承org.eclipse.ui.progress.UIJob
(它本身扩展了org.eclipse.core.runtime.jobs.Job
))。
两者都在运行类型的方法中实现了特定的逻辑(相同!)。对于扩展Job
的类,此方法称为run(IProgressMonitor m)
,对于扩展UIJob
的类,该方法称为runInUIThread(IProgressMonitor m)
。
我想能够
- 只实现一次逻辑(DRY!),例如,让
run()
和runInUIThread
都简单地调用,类似super.run()
。但是,因为在Java类中不能扩展多个类,所以我不能执行类似MyUIJob extends UIJob, MyAbstractJob
的操作,其中MyAbstractJob
实现abstractRun()
和MyUIJob#runInUIThread(){ super.abstractRun() }
- 从相同的方法(例如,在处理程序类中)启动任一作业(
MyJob
和MyUIJob
),这取决于例如标志boolean isUIJob
我简要介绍了"AbstractFactory"one_answers"Prototype"等设计模式,但这些模式似乎不适用于我的情况,因为它们都需要"双扩展继承"。(或者我错了?)
因此出现了一个问题:我如何在Java中实现上述功能?
关于第1点:您可以使用委托:而不是继承
public class MyJob extends Job {
private JobLogic logic;
public MyJob(JobLogic logic) {
this.logic = logic;
}
IStatus run(IProgressMonitor monitor) {
return logic.run(monitor);
}
}
public class MyUIJob extends UIJob {
private JobLogic logic;
public MyUIJob(JobLogic logic) {
this.logic = logic;
}
IStatus runInUIThread(IProgressMonitor monitor) {
return logic.run(monitor);
}
}
public class JobLogic {
IStatus run(IProgressMonitor monitor) {
// logic goes here ...
}
}
顺便说一句,如果需要的话,可以使用依赖注入框架将Jobs绑定到不同的逻辑实例。