如何在保持动态的同时指定接口返回类型?

时间:2012-07-02 18:17:19

标签: c# .net interface

我在这里颠倒过来

我要做的是创建一个适用于不同类型门票的工厂。所以我创建了一个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

1 个答案:

答案 0 :(得分:1)

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

如果您返回List<MocRequest>,预计会有List<ITicket>,则您的API用户可能会使用结果列表并添加ITicket而非MocRequest。在这种情况下List<MocRequest>会做什么?它会破裂,对吧?

因此,编译器坚持要求您返回List<ITicket>

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

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