gpt4 book ai didi

java - 如何使用 DRY 原则创建实现相同方法的两种类型的对象

转载 作者:行者123 更新时间:2023-12-01 10:50:33 25 4
gpt4 key购买 nike

我不太擅长CS领域语言,所以希望我能让自己理解。

我正在寻找DRY基于 boolean 创建两种类型对象的方法旗帜。两种类型各有一个方法(名称不同),该方法实现相同的逻辑。这个逻辑我只想实现一次(在这里考虑一个抽象父类(super class),但我认为在这种情况下它不起作用)。

示例

更具体地说,请考虑这一点。有两个类(在我的例子中,一个继承自 org.eclipse.core.runtime.jobs.Job ,另一个继承 org.eclipse.ui.progress.UIJob (它本身扩展 org.eclipse.core.runtime.jobs.Job ) )。

两者都在 run 类型的方法中实现一定的逻辑(相同!)。对于扩展类 Job ,这个方法叫做run(IProgressMonitor m) ,对于延伸UIJob该方法称为 runInUIThread(IProgressMonitor m) .

我希望能够

  1. 仅实现逻辑一次(干!),例如同时具有 run()runInUIThread只需调用类似 super.run() 。但是因为在 Java 中类不能扩展多个类,所以我不能做像 MyUIJob extends UIJob, MyAbstractJob 这样的事情哪里MyAbstractJob实现abstractRun() ,和MyUIJob#runInUIThread(){ super.abstractRun() } .
  2. 从相同的方法(例如,在处理程序类中)启动任一作业( MyJobMyUIJob ),具体取决于标志 boolean isUIJob 等。 .

我简要了解了“AbstractFactory”和“Prototype”等设计模式,但这些似乎不适用于我的情况,因为它们仍然需要“双扩展继承”。 (还是我错了?)

因此问题是:如何在 Java 中实现上述内容?

最佳答案

关于第 1 点:您可以使用委托(delegate)来代替继承:

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

顺便说一句,您可以使用dependency injection如果需要,框架将作业绑定(bind)到不同的逻辑实例。

关于java - 如何使用 DRY 原则创建实现相同方法的两种类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33939609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com