伙计们我只是想清楚我对抽象类方法的工作有疑问。希望我会得到满意的答案。
我们有Class Base
(抽象类)和Class Derived
(具体类)定义如下:
abstract class Base {
abstract public void operation_first();
public void operation_second{
operation_first();
}
}
class Derived extends Base {
public void operation_first{
//Implementation
}
}
现在我们将operation_second
方法称为
new Derived().operaton_second();
它始终调用派生类operation_first
方法。
我只想知道这种方法背后的逻辑,其中Base类称为派生类方法。
答案 0 :(得分:0)
这称为“后期绑定”。唯一的类函数operation_first
是在Derived中实现的,并且由于后期绑定,Base类知道这个实现。
答案 1 :(得分:0)
当有几个(相关的)类具有公共代码时,我使用此模式。您可以将公共部分放在基类中,并将特定代码放在派生类中,即operation_first方法。在基类中,您可以使用一个方法(这将是您的operation_second方法),您可以在其中放置对所有派生类都相同的操作流。这样,您可以删除重复的代码,并将操作流程放在中心位置。
public abstract class AbstractMessageHandler<T extends RequestMessage>() {
public ResponseMessage process(T requestMessage) {
// some common logic
validate(requestMessage);
// some more common logic
Transaction transaction = getTransaction(requestMessage);
// some more common logic
ResponseMessage response = processTransaction(transaction, requestMessage);
// some more common logic
return response;
}
protected abstract boolean validate(T requestMessage);
protected abstract Transaction getTransaction(T requestMessage)
protected abstract ResponseMessage processTransaction(Transaction transaction, T requestMessage);
}
使用策略模式调用流程方法的代码示例。 EXECUTOR_MAP包含AbstractMessageHandler的所有具体实现。
public ResponseMessage execute(RequestMessage requestMessage)
throws MessageHandlerNotFoundException {
if (requestMessage == null) {
throw new MessageHandlerNotFoundException(
"Request message is null so no message handler could be found.");
}
MessageHandler messageHandler = EXECUTOR_MAP.get(requestMessage.getMessageTypeIdentifier());
if (messageHandler == null) {
throw new MessageHandlerNotFoundException("No message handler found for message: "
+ requestMessage.getClass().getName());
}
ResponseMessage ctepMessageResponse = messageHandler.process(requestMessage);
return ctepMessageResponse;
}
答案 2 :(得分:0)
想象一下,您需要生成不同类型/结构的文档。
实际上,生成XML文件必须运行的算法与生成CSV文件,XLSX文件的算法完全不同......
在这种情况下,有两个级别的模板方法:
您可以尝试使用此API(源代码可用)。
来源:
https://mvnrepository.com/artifact/net.sf.automatic-report-generator(此处提供源代码)。
https://sourceforge.net/projects/automatic-report-generator/