0

编辑 1:泛型并不是指 Java 泛型类的泛型方法,而是我编写的在使用我的程序时必不可少的方法。

我正在尝试编写一个程序(有点像流程集成器),它允许第 3 方开发人员将他们自己的功能部件添加到任务网中。这些片段是从具有runProcess () 方法的类创建的对象(该类实现specialRunnable)。

每当调用 objectrunProcess ()- 方法时,我都不会强制写入日志条目。但是,我不希望实现(写入日志)既不在第 3 方类中,也不在进行方法调用的类中。

我已经搜索并尝试通过继承和实现接口来做到这一点,但还没有找到解决方案。这是我希望它如何工作的示例:

 public abstract class Process{

 public void runProcess(){   
 // when runProcess() is called all specialized processes write to log first
 writeToLog();
 // then do their thing which is defined in their class
 doYourProcessSpecificThing();

 }

 public void writeToLog(){ 
 //writing to log comes here
 }

 // specialized processes have to define what is done
 public abstract void doYourProcessSpecificThing(); 

专科班:

public class Special3rdPartyProcess  extends Process implements specialRunnable{

runProcess(){
super.runProcess();
}

doYourProcessSpecificThing(){
// this is where the magic happens
}

总结一下我想要的:我希望所有进程都使用runProcess () 命令启动,并且在完成时我想要一个日志条目,但我不希望第 3 方开发人员决定如何或是否写入条目。我也不希望这样做:

writeToLog();
task1.runProcess();

writeToLog();
task2.runProcess

谢谢!

4

2 回答 2

3

如果你创建你的runProcess方法final,那么子类将无法覆盖你的方法,这可以确保writeToLog被调用。

您可以writeToLog private不公开实现。

你可以使它doYourProcessSpecificThing protected不能被直接调用,但子类仍然可以定义自己的实现。

这称为模板方法模式。这允许实施者(您)定义可以覆盖哪些特定行为,同时保留对整个过程/算法的控制。

于 2013-07-24T17:05:42.177 回答
1

您可以简单地将 runProcess 在基类中设置为 final,因此子类不能覆盖它:

public abstract class Process{

 public final void runProcess(){   
   writeToLog();
   doYourProcessSpecificThing();
 }

 //private: implementation detail
 private void writeToLog(){ 
 }

 //protected: calling classes don't need to know about this method
 protected abstract void doYourProcessSpecificThing(); 

还有你的子类:

public class Special3rdPartyProcess  extends Process implements specialRunnable{
  protected final void doYourProcessSpecificThing(){
    // this is where the magic happens
  }
}

然后客户端代码只是做:

Special3rdPartyProcess spp = ...;
spp.runProcess();
于 2013-07-24T17:05:49.487 回答