首页 > 解决方案 > 继承和接口设计改进

问题描述

所以我有以下设计:

对于模型:

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 方法,所以我什至不确定是否应该创建一个票务管理器类并将这些方法添加到模型中。我对何时应该在模型中添加方法或将它们放入自己的类感到困惑。

标签: javainheritanceinterface

解决方案


您可能希望在工单管理器界面中使用泛型:

public interface TicketManager<T extends ParentTicket> {
    Collection<T> getTickets();
    void saveTicketToDb(T ticket);
}

这里的关键是将泛型参数限制TParentTicket. 这个 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;
}

推荐阅读