从该抽象中的方法调用抽象方法是否可取 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();
}
}
其中引用的类型是接口。
这提供了明确的职责分离。这使得单元测试更容易、记录更容易、更灵活(如果权限检查可能不同但响应发送者是可重用的)。
这个问题我想了很久
我必须执行这个过程 -
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();
}
}
其中引用的类型是接口。
这提供了明确的职责分离。这使得单元测试更容易、记录更容易、更灵活(如果权限检查可能不同但响应发送者是可重用的)。