【问题标题】:Java wrap a child class method such that the parent method gets called first and then calls child class methodJava包装了一个子类方法,这样父方法首先被调用,然后再调用子类方法
【发布时间】:2021-05-05 23:09:10
【问题描述】:

我有一个有很多方法的类。这个类被复制到几个不同的地方,每个方法的作用略有不同。我要做的是将通用代码移到具有相似方法签名的类中,但参数是另一个类的参数中的对象继承的基类。当调用继承类中的方法时,我希望它重定向到基类方法,执行该代码,然后以某种方式回调到继承类方法。 我无法提供确切的代码,但我希望这个例子就足够了。

class BaseTableVersion{
   Long getId();
   void setId(Long id);
   String getVersion();
   void setVersion(String version);
   TableType getTableType();
}

class TableVersion extends BaseTableVersion{
   Long getVersionNumber();
   void setVersionNumber(Long versionNumber);
}


//this class needs to exists in some capacity. I can't make it inherit a class as it is now because
//it already inherits another class (which I can't show or change) and java doesn't support multiple. 
// inheritence. I can add members or change methods 
class TableVersionRules{
    void create(TableVersion tableVersion){
        //do stuff
    }

    void versionChanged(TableVersion tableVersion){
          //do stuff
    }
}

//this class doesnt need to exists, its just to hopefully illustrate what i want.
class BaseTableVersionRules<B extends BaseTableVersion>{
    void create(B tableVersion){
        //do stuff
        //call TableVersionRules.create(tableVersion) somehow
    }

    void versionChanged(B tableVersion){
          //do stuff
        //call TableVersionRules.versionChanged(tableVersion) somehow
    }
}

所以,从概念上讲,我想要以某种方式链接 TableVersionRules 和 BaseTableVersionRules,这样当调用 TableVersionRules.versionChanged 时,它将首先调用 BaseTableVersionRules.versionChanged,然后执行 TableVersionRules.versionChanged 中的操作。我可以为此使用什么设计模式,或者这只是违反多态性?

【问题讨论】:

  • 您说您想从您的BaseTableVersionRules.create 调用TableVersionRules.create(...),但BaseTableVersionRules 没有扩展TableVersionRules 或持有一个实例?
  • 是的,但是 BaseTableVersionRules 可以更改。
  • 我只是对你的标题感到困惑。您说过您希望子类调用父类方法,但您的问题中没有父类或子类?

标签: java inheritance wrapper


【解决方案1】:

它看起来像是使用“super”关键字调用父类的子类的继承。类似的东西:

class TableVersionRules extends BaseTableVersionRules {
  void versionChanged(...) {
    super.versionChanged(...);
    // Do some more stuff here.
  }
}

“Super”会从父类调用实现,然后你仍然可以在这里添加更多代码。

有意义吗?

更新:如果您不能使用“扩展”,因为类已经扩展了其他内容,请尝试使用本地字段:

class TableVersionRules extends SomeOtherStuffThatNeedsToBeThere {
  private final BaseTableVersionRules delegate;

  void versionChanged(...) {
    delegate.versionChanged(...);
    // Do some more stuff here.
  }
}

【讨论】:

  • 我不能让 TableVersionRUles 根据我在 TableVersionRules 上面的评论扩展 BaseTableVersionRules。
  • 如果您需要多重继承(这在 Java 中是不可能的),您可以切换到委托(在您的子类中有一个字段,您可以使用它来委托给“父”类,即不是真正的父母)?让我尝试更新代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2012-02-22
相关资源
最近更新 更多