2

我一直在想这个问题很长一段时间。建议从抽象类中的方法调用抽象方法

我执行此过程 -

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(); 

它会是一个很好的设计?

+3

这听起来像模板模式:https://en.wikipedia.org/wiki/Template_method_pattern – quamrana

回答

3

这主要是罚款,除了一些要点:

  • 如果只应该抽象方法从process()方法中调用,而不是indepenently,从任何其他外部类,那么就应该保护,不公开。
  • 如果子类不应该改变的process()实施,因为每一道工序必须遵循此模板,那么process()方法应该是最终
  • 如果是不应该的example()方法从外部类中调用,但只是作为子类中sendResponse()的实现的一部分,那么它没有理由存在于基类中。 sendResponse()已经是抽象的,并且子类因此可以自由地以它想要的方式实现它。所以迫使它也实施了一个不用在任何地方的example()方法是没用的。
1

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

它可能会更好,而不是有两个或两个以上的类/接口,和一个“司机”类:

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

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

凡引用类型的接口。

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