首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果子实现接口vs覆盖,则调用方法

如果子实现接口vs覆盖,则调用方法
EN

Code Review用户
提问于 2017-05-25 12:15:14
回答 1查看 101关注 0票数 0

我有一个类似于next的等级结构:

代码语言:javascript
复制
 AbstractRequestWs
   |- CreatorRequestWs
   |- CheckRequestWs
   |- GetRequestWs
   |- DeleteRequestWs

在这个实现中,我用通用代码处理ws调用。因此,我创建了一个抽象类,它包含一些常见的逻辑和结构。

因此,我创建了一个类似于next的类:

代码语言:javascript
复制
public abstract class AbstractRequestWs {

    protected Entity itemMapped;
    protected final EntityToMap entityToMap;        

    public AbstractRequestWs(EntityToMap entityToMap) {
        this.entityToMap = entityToMap;
    }

    public Entity map() {
        doSometing();
        //Do this?? or instead override this method on childs
        if (this instanceof StatusUpdatable) {
            ((StatusUpdatable) this).calcualteStatus();
        }
        return mapToEntity();
    }

    protected abstract void doSometing();

    private Entity mapToEntity() {
       //common impl
    }

}

然后,一些孩子需要更新一个状态(这需要大量的计算),而另一些则不需要,我的想法是用一个StatusUpdatable方法创建一个接口calcualteStatus,所以如果一个子接口实现了这个接口,那么将在抽象父类中调用calculateStatus。

例如,创建者实现了StatusUpdatable,因此将调用calculateStatus方法。

代码语言:javascript
复制
 public CreatorRequestWs implements StatusUpdatable {
   //....
     public void calculateStatus() {
        //
     }
 }

否则,GetRequestW不会实现StatusUpdatable,因此不会调用calculateStatus方法。

代码语言:javascript
复制
public GetRequestWs {
   //....
}

这是个好主意吗?检查一个子接口是否实现了某个接口并调用了该接口的一个方法,或者以其他方式覆盖了这个公共方法并直接执行它?

否则,我将不得不重写类中的map()方法,该方法需要计算状态:

代码语言:javascript
复制
public CreatorRequestWs  {

   //....

   @Override
   public Entity map() {
       doSometing();
       calcualteStatus();
       return mapToEntity();
   }

   public void calculateStatus() {
      //...
   }
}

我看到读取比重写映射更困难,因为calculateStatus调用的方法是由父类隐藏的,但否则我不会重复代码。

你认为如何?

EN

回答 1

Code Review用户

发布于 2017-05-26 06:18:41

我认为拥有calculateStatus方法的类应该在它们的doSomeThing()结束时调用它。

或者,如果您希望重用更多的代码,请创建一个AbstractRequestStatusUpdatableWs,如下所示:

代码语言:javascript
复制
abstract class AbstractRequestStatusUpdatableWs implements StatusUpdatable
{
     abstract void calculateStatus();
     abstract void doSomeRealWork();

     public final void doSomeThing()
     { 
           doSomeRealWork();
           calculateStatus();
     }
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/164172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档