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

凡引用類型的接口。

這提供了明確的職責分離。這使得單元測試更容易,更容易記錄,更靈活(如果權限檢查可能不同,但響應發送者可重用)。