【发布时间】:2020-04-09 01:14:34
【问题描述】:
我正在构建一个为销售订单和销售发票生成 PDF 文档的应用程序。为简单起见,我排除了冗余逻辑和字段。
这是我的班级结构:
public class SalesEntity {
public String name;
public String createdDate;
}
public class SalesOrder extends SalesEntity {
}
public class SalesInvoice extends SalesEntity {
public String invoiceSpecificField;
}
以及用于包装器和列表项的类似结构:
public class SalesEntityItem {
public String name;
public String price;
}
public class SalesOrderItem extends SalesEntityItem {
}
public class SalesInvoiceItem extends SalesEntityItem {
public String invoiceItemSpecificField;
}
public class SalesEntityResponse {
public SalesEntity salesEntity;
public List<SalesEntityItem> salesEntityItems;
}
这是问题的第一部分。
public class SalesOrderEntityResponse extends SalesEntityResponse {
// public SalesOrder salesEntity; <-- say somehow to java that in this subclass the property type should also be subclass
// public List<SalesOrderItem> salesEntityItems;
}
对于构建机制,我使用的是模板方法:
public class PDFBuilder extends AbstractPDFBuilder {
protected void buildPdfDocument(Map<String, Object> model /*...*/) throws Exception {
/*...*/
addEntityNumber(document, salesEntityResponse);
addItems(document, salesEntityResponse);
}
}
public class OrderPDFBuilder extends PDFBuilder {
/*...*/
@Override
protected void addEntityNumber(Document document, SalesEntityResponse entityResponse) throws DocumentException {
/*...*/
PdfPTable documentNameTable = new PdfPTable(1);
Phrase documentNamePhrase = new Phrase(entityResponse.labels.account_number, timesFont);
PdfPCell documentNameCell = new PdfPCell(documentNamePhrase);
documentNameTable.addCell(documentNameCell);
document.add(documentNameTable);
}
@Override
protected void addItems(Document document, SalesEntityResponse entityResponse) throws DocumentException {
/*...*/
for (SalesEntityItem salesEntityItem : entityResponse.salesEntityItems) {
/* Items adding specific logic */
}
}
}
如果 somwhow 的第一部分可以解决,那么主要部分如下:
问题:如何进行具体的模板方法实现(OrderPDFBuilder, InvoicePDFBuilder)
分别接收子类型SalesEntityResponse(SalesOrderResponse和SalesInvoiceResponse)的参数?因此,在特定的实现中,我可以使用这些实体的特定字段。是否有意义?我假设这里是一些与有界类型有关的东西,但我不确定如何正确使用它。
【问题讨论】:
标签: java generics inheritance types