java抽象class用于继承
java abstract class for inheritance
我有一个项目,我目前正在使用 org.apache.poi
将 excel 文件中的记录加载到数据库中
我将 3 种文件加载到不同的 Dto classes 中。
其中两个 dto 共享相同的基 class(它们具有共同的属性)
@Getter
@Setter
@ToString
public class PpyRecordDTO {
private String units;
private Double quantity;
}
@Getter
@Setter
@ToString
public class FirstRecordDTO extends RecordDTO {
private String normDescription;
private String relatedUnits;
}
@Getter
@Setter
@ToString
public class SecondRecordDTO extends RecordDTO{
private String normName;
}
@Getter
@Setter
@ToString
public class ThirdRecordDTO {
private String code;
}
ThirdRecordDto class 具有独特的属性,并且与基本 dto class RecordDTO
没有共享属性
我想从这个方法中 return 基础 class : RecordDto(但 ThirdRecordDTO 不能扩展它,因为没有公共字段)
public static List<?extends RecordDTO> readPpyExcelFile(MultipartFile file, SourceType sourceType){
//TODO: making readPpyExcelFile generic
try {
Workbook workbook = WorkbookFactory.create(new BufferedInputStream(file.getInputStream()));
Sheet sheet = workbook.getSheetAt(0);
Iterator<Row> rows = sheet.iterator();
List<? extends RecordDTO> lstRecords = processRecords(rows, sourceType);
// Close WorkBook
workbook.close();
return lstRecords;
} catch(ApiGenericException apiException){
throw new ApiGenericException(apiException.getStatus(), apiException.getMessage(), apiException.getErrorType());
} catch (Exception e) {
logger.error(e.getMessage());
throw new ApiGenericException(HttpStatus.INTERNAL_SERVER_ERROR,"Enable while loading the file", ApiErrorType.Unhandled
);
}
}
有没有一种方法可以使 dto ThirdRecordD 也被 return 编辑或继承自其他 dto 共享的抽象 class 以便 return 类型 < ?从此方法扩展列表?
一般来说,你可以这样选择:
public interface Ppy {
// common methods if any
}
public class PpyRecordDTO implements Ppy{...}
public class FirstRecordDTO extends PpyRecordDTO {...} // so that it also implements Ppy interface
public class SecondRecordDTO extends PpyRecordDTO {...} // the same as above
public class ThirdRecordDTO implements Ppy {...} // Note, it doesn't extend PpyRecordDTO but implements the interface
现在在方法中,可以:
public static List<Ppy> readPpyExcelFile(MultipartFile file, SourceType sourceType){...}
这会起作用,但是,您应该问自己以下问题:调用此方法的代码将做什么,即它将如何区分不同的实现?
如果接口有一个对所有实现都有意义的通用方法——很好,它将能够调用该方法。例如,如果它有一个像 render(Page)
之类的方法,代码可能是:
List<Ppy> ppis = readPpyExcelFile(...);
Page page = ...
for(Ppy ppi : ppis) {
ppi.render(page);
}
但是,如果该接口没有任何通用方法 - 它也无济于事。当子对象可以被视为父对象的特化(以便子对象“是”父对象)时,使用继承。所以想想继承在这里是否真的合适,假设 ThirdRecordDTO
与 类.
的其余部分没有任何共同点
我有一个项目,我目前正在使用 org.apache.poi
将 excel 文件中的记录加载到数据库中我将 3 种文件加载到不同的 Dto classes 中。 其中两个 dto 共享相同的基 class(它们具有共同的属性)
@Getter
@Setter
@ToString
public class PpyRecordDTO {
private String units;
private Double quantity;
}
@Getter
@Setter
@ToString
public class FirstRecordDTO extends RecordDTO {
private String normDescription;
private String relatedUnits;
}
@Getter
@Setter
@ToString
public class SecondRecordDTO extends RecordDTO{
private String normName;
}
@Getter
@Setter
@ToString
public class ThirdRecordDTO {
private String code;
}
ThirdRecordDto class 具有独特的属性,并且与基本 dto class RecordDTO
没有共享属性我想从这个方法中 return 基础 class : RecordDto(但 ThirdRecordDTO 不能扩展它,因为没有公共字段)
public static List<?extends RecordDTO> readPpyExcelFile(MultipartFile file, SourceType sourceType){
//TODO: making readPpyExcelFile generic
try {
Workbook workbook = WorkbookFactory.create(new BufferedInputStream(file.getInputStream()));
Sheet sheet = workbook.getSheetAt(0);
Iterator<Row> rows = sheet.iterator();
List<? extends RecordDTO> lstRecords = processRecords(rows, sourceType);
// Close WorkBook
workbook.close();
return lstRecords;
} catch(ApiGenericException apiException){
throw new ApiGenericException(apiException.getStatus(), apiException.getMessage(), apiException.getErrorType());
} catch (Exception e) {
logger.error(e.getMessage());
throw new ApiGenericException(HttpStatus.INTERNAL_SERVER_ERROR,"Enable while loading the file", ApiErrorType.Unhandled
);
}
}
有没有一种方法可以使 dto ThirdRecordD 也被 return 编辑或继承自其他 dto 共享的抽象 class 以便 return 类型 < ?从此方法扩展列表?
一般来说,你可以这样选择:
public interface Ppy {
// common methods if any
}
public class PpyRecordDTO implements Ppy{...}
public class FirstRecordDTO extends PpyRecordDTO {...} // so that it also implements Ppy interface
public class SecondRecordDTO extends PpyRecordDTO {...} // the same as above
public class ThirdRecordDTO implements Ppy {...} // Note, it doesn't extend PpyRecordDTO but implements the interface
现在在方法中,可以:
public static List<Ppy> readPpyExcelFile(MultipartFile file, SourceType sourceType){...}
这会起作用,但是,您应该问自己以下问题:调用此方法的代码将做什么,即它将如何区分不同的实现?
如果接口有一个对所有实现都有意义的通用方法——很好,它将能够调用该方法。例如,如果它有一个像 render(Page)
之类的方法,代码可能是:
List<Ppy> ppis = readPpyExcelFile(...);
Page page = ...
for(Ppy ppi : ppis) {
ppi.render(page);
}
但是,如果该接口没有任何通用方法 - 它也无济于事。当子对象可以被视为父对象的特化(以便子对象“是”父对象)时,使用继承。所以想想继承在这里是否真的合适,假设 ThirdRecordDTO
与 类.