2012-07-02 25 views
1

我要翻倒在這裏如何在仍保持動態的情況下指定接口返回類型?

我想要做的是創建一個適用於不同類型票證的工廠。所以我創建一個具有幾個特徵像

GetOpen(); 
GetById(int id); 

現在,這些方法都需要返回一個實例或同一張票類型的實例列表的ITicket接口,所以我想我有接口像這樣

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

因此,在實踐中,我希望建立工廠方法是這樣的:

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

好了,現在比如,我回到我的課MocRequest和實施將L像這樣的IST 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

+0

這是測試嗎? Moc讓我相信它可能是,如果有的話,還有其他方法可以在這裏使用。 –

+0

是的,我只是想概念化這將如何工作,所以備用解決方案也會有所幫助 – Sinaesthetic

回答

1

MocRequest可能是ITicket,但那不會使List<MocRequest> a List<ITicket>

如果返回List<MocRequest>其中List<ITicket>的預期,你的API的用戶可能使用產生的列表,並添加一個ITicket這不是一個MocRequestList<MocRequest>在那種情況下會做什麼?它會打破,對吧?

因此,編譯器堅持要求您返回List<ITicket>

一般來說,不建議返回List<T>,因爲不清楚您是否返回內部內容副本或參考實際內部列表。最好將返回類型聲明爲IEnumerable<ITicket>,這意味着您只返回票證,而不是可寫列表對象。 (您的API的用戶可以自由地將這些票據插入他/她自己的列表中。)

有關如何返回枚舉的更多信息,我們需要獲取有關票據外觀的更多信息就像從數據庫中獲取數據一樣。他們是在列表中還是在構建該列表等?

+0

這裏的重點不在於列表(儘管我很欣賞您在此提出的觀點)。我試圖編寫一個基本接受任何已經實現了ITicket接口並返回它所提供的「類型」的方法。爲什麼界面?因爲我們將把這個接口附加到不一定繼承父Ticket類的東西上。 – Sinaesthetic

+0

要回答斜體,它取決於發出請求的故障單。我的一個構造函數需要一個票證ID。該服務根據TicketTypeID知道它試圖構造什麼類型的票據,併爲調用票證類型對象返回適當的DTO。每張票都有一些共同的信息(創建日期,創建等等),但其餘的是非常具體的票,這就是爲什麼我的工廠需要返回實際票型 – Sinaesthetic

+0

@Sinaesthetic:我認爲主要問題是無論您是否需要訪問返回對象的特定於類型的成員。你知道你打的是哪個工廠(意思是他們每個工廠的方法簽名都可以有不同的返回類型),或者你只是打電話給一家工廠,知道你會找回一個「ITicket」(可以是根據當前的工廠由不同的類實現;調用工廠時你不能/不需要區分)? –

相關問題