首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承和界面设计改进

继承和界面设计改进
EN

Stack Overflow用户
提问于 2019-05-11 21:42:29
回答 2查看 56关注 0票数 2

所以我有如下的设计:

对于模型:

代码语言:javascript
复制
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
}

对于票务经理,我有以下几点

代码语言:javascript
复制
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 
   }

}

我对如何改进设计感到困惑,因为现在很难添加更多的票证管理器/其他类型的票证(我认为至少是这样)

我尝试创建一个由票证管理器实现的接口:

代码语言:javascript
复制
public interface IManageTickets{
  public Collection getAllTickets();
  public void saveTicketToDB(Ticket ticket);
  //some other methods
}

但是我似乎不能正确地实现它,因为Ticket参数不接受子票证。

此外,我在这里将采用MVC方法,因此我甚至不确定是否应该创建一个票证管理器类,并将这些方法添加到模型中。我对什么时候应该在模型中添加方法或将它们放入自己的类中感到困惑。

EN

回答 2

Stack Overflow用户

发布于 2019-05-11 21:54:39

创建工单接口

代码语言:javascript
复制
public interface Tickets {

}

让不同的票证实现接口

代码语言:javascript
复制
public class ChildTicket1 implemnets ParentTicket{


  //getters and setters here
}


public class ChildTicket2 implemnets ParentTicket{


  //getters and setters here
}

这是票证管理器类传递类型作为票证的接口类型

代码语言:javascript
复制
public class TicketManager{

       public ArrayList<Tickets> getAlltickets(){ 
           //some implementation 
       }

       public void saveTicketToDB(Tickets ticket){ 
           //some implementation 
       }

    }

如果你想要你的属性,你可以这样做

代码语言:javascript
复制
public class Tickets {
 protected ticketAttribute1
 protected ticketAttribute2
 protected ticketAttribute3
}

public class ChildTicket1 extends ParentTicket{


  //getters and setters here
}


public class ChildTicket2 extends ParentTicket{


  //getters and setters here
}





public class TicketManager{

       public ArrayList<Tickets> getAlltickets(){ 
           //some implementation 
       }

       public void saveTicketToDB(Tickets ticket){ 
           //some implementation 
       }

    }

这种模式称为策略模式。如果您想了解有关如何设计应用程序的更多信息,请更多地了解设计模式。这是一个很好的参考,找到它并阅读它,如果你想要http://shop.oreilly.com/product/9780596007126.do

票数 0
EN

Stack Overflow用户

发布于 2019-05-11 22:50:30

您可能希望在票证管理器接口中使用泛型:

代码语言:javascript
复制
public interface TicketManager<T extends ParentTicket> {
    Collection<T> getTickets();
    void saveTicketToDb(T ticket);
}

这里的关键是将泛型参数T限制为ParentTicket的子类。这在ChildTicket1中的实现如下所示:

代码语言:javascript
复制
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,则此方法特别有用,例如:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56090886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档