我一直想知道这件事。
我必须执行此过程 -
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();
这是一个好的设计吗?
答案 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();
}
}
引用的类型是接口。
这明确区分了责任。这使得单元测试更容易,文档更容易,更灵活(如果权限检查可能不同但响应发送者可重用)。