1

我要在这里颠倒过来

我正在尝试做的是创建一个处理不同类型票证的工厂。所以我创建了一个 ITicket 接口,它有几个签名,比如

GetOpen(); 
GetById(int id);

现在,这些方法需要返回一个实例或相同票证类型的实例列表,所以我想我应该让界面看起来像这样

List<ITicket> GetOpen();
ITicket GetById(int id);

所以在实践中,我希望创建这样的工厂方法:

public static List<ITicket> GetOpen(ITicket ticket)
{
   return ticket.GetOpen();
}

好的,现在例如,我回到我的类 MocRequest 并实现 List GetOpen() 方法,如下所示:

public List<MocRequest> GetOpen()
{
   //implementation grabs a bunch of MocTickets out of the database 
   and converts them into instances of the MocTicketClass and returns them
}

我收到一条错误消息,说这不是一个有效的实现,因为返回类型是 MocRequest 而不是 ITicket。我认为 MocRequest 在这个阶段是 ITicket,事后看来,我想它有点循环,所以它不起作用。返回类型需要是 MocRequest 以便它仍然可以使用。

我已经尝试将界面制作成更像的东西,ITicket<T>但是我仍然必须在工厂中指定票证类类型,这会违背目的。

所以这里的目标是在工厂中创建一个可以处理这些东西的静态方法。我这样做对吗?我该如何进行这项工作?还是我仍然坚持使用多种方法来处理它们?TIA

4

1 回答 1

1

MocRequest可能是 a ITicket,但这不会成为List<MocRequest>a List<ITicket>

如果您在预期a 的List<MocRequest>地方返回 a,您的 API 用户可能会使用结果列表并添加一个不是 a 的。在这种情况下会怎么做?会坏的,对吧?List<ITicket>ITicketMocRequestList<MocRequest>

因此,编译器坚持让你返回一个List<ITicket>.

一般来说,不建议返回List<T>,因为不清楚您是返回内部内容的副本还是对实际内部列表的引用。最好将返回类型声明为IEnumerable<ITicket>,这基本上意味着您只返回票证,而不是可写的列表对象。(您的 API 用户可以自由地将这些票证插入到他/她自己的列表中。)

有关如何返回枚举的更多信息,我们需要获取有关从数据库获取票证后的外观的更多信息。它们在列表中还是您构建了该列表等?

于 2012-07-02T18:27:05.740 回答