是否可以从该抽象类中的方法调用抽象方法

时间:2015-08-08 18:26:47

标签: design-patterns abstract-class object-oriented-analysis

我一直想知道这件事。

我必须执行此过程 -

process(){
   bool allow=checkForPermission();
   if(allow) {
      processRequest();
   }
   sendResponse();
}

现在我用三种抽象方法制作了一个抽象的X类:

abstract class X {
   public abstract sendResponse();
   public abstract checkPermission();
   public abstract sendResponse();
   public abstract example(); // some example which is called from sendResponse() from where it is implemented.

   public void process() {
      bool allow=checkForPermission();
      if(allow) {
         processRequest();
      }
      sendResponse();
   }
}

A类延伸X;这是我不确定的地方。当A实现所有抽象方法时,在sendResponse()方法中它调用IfError()函数,它是一个好的设计吗?

我的朋友建议:它就像编译器首先调用X.process()然后调用A实现的方法,再调用A到X(其中sendResponse()将调用example()方法),我的朋友说这不是好的设计:

X obj = new A();
obj.process();

这是一个好的设计吗?

2 个答案:

答案 0 :(得分:3)

除了一些要点之外,这很好:

  • 如果抽象方法只应该从process()方法内部调用,而不是从任何其他外部类中独立调用,那么它们应该受到保护,而不是公开。
  • 如果子类不应该更改process()的实现,因为每个进程都必须遵循此模板,那么process()方法应该是最终的
  • 如果不应该从外部类调用example()方法,而只是作为子类中sendResponse()实现的一部分,则它没有理由存在于基类中。 sendResponse()已经是抽象的,因此子类可以按照它想要的方式自由地实现它。因此强迫它实现一个没有在任何地方使用的example()方法是没用的。

答案 1 :(得分:1)

这是一种可接受的模式,但有时它表明您正在将实现与接口混合。

最好有两个或更多类/接口和一个“驱动程序”类:

class DriverX {
   RequestProcessor  requestProcessor;
   ResponseSender    responseSender;
   PermissionChecker permissionChecker;

   public void process() {
      if (permissionChecker.checkPermission()) {
         requestProcessor.processRequest();
      }
      responseSender.sendResponse();
   }
}

引用的类型是接口。

这明确区分了责任。这使得单元测试更容易,文档更容易,更灵活(如果权限检查可能不同但响应发送者可重用)。