java - 继承和接口设计改进
问题描述
所以我有以下设计:
对于模型:
public class ParentTicket{
protected ticketAttribute1
protected ticketAttribute2
protected ticketAttribute3
//getters and setters here
}
public class ChildTicket1 extends ParentTicket{
private childTicket1Attr1
private childTicket1Attr2
private childTicket1Attr3
//getters and setters here
}
public class ChildTicket2 extends ParentTicket{
private childTicket2Attr1
private childTicket2Attr2
private childTicket2Attr3
//getters and setters here
}
对于票务经理,我有以下内容
public class TicketManager1{
public ArrayList<ChildTicket1> getAlltickets(){
//some implementation
}
public void saveTicketToDB(ChildTicket1 ticket){
//some implementation
}
}
public class TicketManager2{
public ArrayList<ChildTicket2> getAlltickets(){
//some implementation
}
public void saveTicketToDB(ChildTicket2 ticket){
//some implementation
}
}
我很困惑如何改进设计,因为现在很难添加更多票务管理器/其他类型的票(至少我这么认为)
我试图制作一个由票务管理器实现的接口:
public interface IManageTickets{
public Collection getAllTickets();
public void saveTicketToDB(Ticket ticket);
//some other methods
}
但我似乎无法正确实现它,因为 Ticket 参数不接受子票。
另外,我要在这里采用 MVC 方法,所以我什至不确定是否应该创建一个票务管理器类并将这些方法添加到模型中。我对何时应该在模型中添加方法或将它们放入自己的类感到困惑。
解决方案
您可能希望在工单管理器界面中使用泛型:
public interface TicketManager<T extends ParentTicket> {
Collection<T> getTickets();
void saveTicketToDb(T ticket);
}
这里的关键是将泛型参数限制T
为ParentTicket
. 这个 for 的实现ChildTicket1
如下所示:
public class TicketManager1 implements TicketManager<ChildTicket1> {
@Override
public Collection<ChildTicket1> getTickets() {
// implementation goes here
return null;
}
@Override
public void saveTicketToDb(ChildTicket1 ticket) {
// implementation goes here
}
}
如果您需要构建一个可以访问所有票证类型的 API,这种方法会特别有用,例如:
public Collection<ParentTicket> getAllTickets() {
List<TicketManager<? extends ParentTicket>> managers; // contains a list of all TicketManager implementations
List<ParentTicket> tickets = new ArrayList<>();
for (TicketManager<? extends ParentTicket> manager : managers) {
tickets.addAll(manager.getTickets());
}
return tickets;
}
推荐阅读
- java - 如何通过查询获取sqlite表中特定名称的数量
- excel - 将 Excel 单元格的图片保存到 Word 文档中
- c# - 当我从 URL 读取 PDF 时,它正确显示英文数据,但其他语言文本在 C# 中不正确
- vue.js - 使用 v-slot:body 时 Vuetify v-data-table 没有响应
- python - 如何根据python 3中8列的输入数据预测3列的输出数据?
- python - Python Pandas 导出 -> 将制表符添加到行
- python - BeautifulSoup 不刮花
- api - 什么是方法 API 测试?
- git - git 日志 --since
显示从迁移日期开始的提交,但没有“--since”显示所有提交 - javascript - Vue 有条件地阻止事件传播给子级