从该抽象中的方法调用抽象方法是否可取 Class

Is it advisable to call abstract methods from a method in that Abstract Class

这个问题我想了很久

我必须执行这个过程 -

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

现在我用三个抽象方法做了一个抽象Class 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();
   }
}

Class A 扩展 X;这是我不确定的地方。当A在实现所有抽象方法时,在sendResponse()方法中调用IfError()函数,这样的设计好吗?

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

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

会不会是一个好的设计?

这基本上没问题,但有几点除外:

  • 如果抽象方法只应该从 process() 方法内部调用,而不是独立地从任何其他外部 class 调用,那么它们应该受到保护,而不是 public.
  • 如果 subclasses 不应该改变 process() 的实现,因为每个进程都必须遵循这个模板,那么 process() 方法应该是 final
  • 如果 example() 方法不应该从外部调用 class,而只是作为 subclasses 中 sendResponse() 实现的一部分,那么它没有理由存在于基地 class。 sendResponse() 已经是抽象的,因此 subclass 可以自由地按照自己的方式实现它。因此,强制它也实现一个未在任何地方使用的 example() 方法是没有用的。

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

最好有两个或更多 classes/interfaces 和一个 "driver" class:

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

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

其中引用的类型是接口。

这提供了明确的职责分离。这使得单元测试更容易、记录更容易、更灵活(如果权限检查可能不同但响应发送者是可重用的)。