2013-04-14 154 views
0

假設我有一個基類使用繼承與泛型

class Document 
{ 
//some properties 
} 

和 兩個派生類:

public class Order:Document 
    { 
    //some properties 
    } 
public class Request:Document 
{ 
    //some properties 
} 

現在我想做出有一個服務層的分層應用程序。我也想有一個基本服務層的接口,如:

public interface IBaseService<T> where T:Document 
{ 
    IList<T> GetAll(); 
} 

,我的層服務類實現它:

public SaleService:IBaseService<Document>; 

所以,我必須定義IList<Document> GetAll()實現基本服務,但我想我的SaleService有IList<Order> GetAll()IList<Request> GetAll()方法,而不是IList<Document> GetAll()。 我該怎麼做?

+0

你不能因爲你在'IBaseService '接口中設置了一個'IList '方法。 – MarcinJuraszek

+0

聽起來像你必須在同一個類上有兩個不同的'GetAll()'方法,並且返回類型不同。你不能這樣做在C#中。請嘗試澄清您的問題。 – harpo

+0

是的我有兩個不同的GetAll()方法在同一類與不同的返回類型。 – Masoud

回答

4

你需要用不同的泛型參數來實現IBaseService<T>明確:

public class SalesService : IBaseService<Order>, IBaseService<Request> 
{ 
    IList<Order> IBaseService<Order>.GetAll() 
    { 
     //return orders 
    } 

    IList<Request> IBaseService<Request>.GetAll() 
    { 
     //return requests 
    } 
} 

的實現方法,只能通過界面上顯示,所以你必須要轉換爲例如打電話給他們

IBaseService<Request> service = new SalesService(); 
IList<Request> request = service.GetAll(); 

你的客戶端代碼應該只依賴於IBaseService<T>接口上,所以你不應該需要經常這樣做。

+0

,但通過明確實現'IBaseService '和'IBaseService ',GetAll方法的修飾符是私有的,我不能在我的客戶端代碼中使用它們。如果將GetAlls的修飾符更改爲public,則會出現此錯誤:「修飾符'public'對此項無效」 – Masoud

+1

@Masoud - 是的,它們只能通過界面顯示,因此您需要投射 - 請參閱更新。如果您想直接調用'SalesService'類的'GetAll',則可以隱式實現其中一個'IBaseService '接口。 – Lee

+0

謝謝,我測試了它,它工作。也可以使用'IBaseService service = new SalesService();'但是另外一個問題,我如何在最後一行代碼中聲明'IList '而不是'IList '? – Masoud