2009-09-30 145 views
4

我從以前的問題,這個代碼,但它不是編譯:如何解決存儲庫模式問題這個泛型?

public interface IEntity 
{  
// Common to all Data Objects 
} 
public interface ICustomer : IEntity 
{ 
    // Specific data for a customer 
} 
public interface IRepository<T, TID> : IDisposable where T : IEntity 
{ 
    T Get(TID key); 
    IList<T> GetAll(); 
    void Save (T entity); 
    T Update (T entity); 
    // Common data will be added here 
} 
public class Repository<T, TID> : IRepository 
{ 
    // Implementation of the generic repository 
} 
public interface ICustomerRepository 
{ 
    // Specific operations for the customers repository 
} 
public class CustomerRepository : Repository<ICustomer>, ICustomerRepository 
{ 
    // Implementation of the specific customers repository 
} 

但在這兩條線:

1-公共類資源庫:IRepository

2-公共類CustomerRepository:存儲庫,ICustomerRepository

它給我這個錯誤:使用泛型類型'TestApplication1.IRepository'需要'2'類型參數

你能幫我解決嗎?

回答

5

從存儲庫/ IRepository繼承時,因爲他們需要採取兩種類型的參數,您需要使用兩個類型參數。也就是說,當你從IRepository繼承時,需要指定是這樣的:類型「:

public class Repository<T, TID> : IRepository<T,TID> where T:IEntity 

public class CustomerRepository : Repository<ICustomer,int>,ICustomerRepository 

編輯以在執行Reposistory

+0

ICustomerRepository在他的代碼中是非泛型的。 – 2009-09-30 00:23:29

+0

啊,是的,只是注意到,因爲我點擊Submit ... – JasonTrue 2009-09-30 00:25:24

+0

現在給出這個錯誤:類型'T'不能用作通用類型或方法'TestApplication1.IRepository '中的類型參數'T'。沒有從'T'到'TestApplication1.IEntity'的裝箱轉換或類型參數轉換。 – 2009-09-30 00:41:19

2

當您實現通用接口時,還需要提供通用接口類型規範。這兩行更改爲:

public class Repository<T, TID> : IRepository<T, TID> 
    where T : IEntity 
{ 
    // ... 

public class CustomerRepository : Repository<ICustomer, int /*TID type*/>, ICustomerRepository 
{ 
    // ... 
+0

現在給這個錯誤添加類型約束T'不能用作泛型類型或方法'TestApplication1.IRepository '中的類型參數'T'。沒有從'T'到'TestApplication1.IEntity'的裝箱轉換或類型參數轉換。 – 2009-09-30 00:37:31

+0

對不起 - 我編輯了我的答案。您必須將T:IEntity的約束放入Repository中。我忘了包括這一點。 – 2009-09-30 01:00:33