2010-08-02 144 views
3

我想創建一個基於this post的通用LINQ-TO-SQL存儲庫,它基本上可以讓你定義一個通用的基礎知識庫類,然後你可以定義所有的實際知識庫類來自通用基礎。從泛型類泛型類中缺少構造函數

我想使用一個倉庫有或沒有通過數據上下文的選項,所以我決定在通用基類來創建兩個構造函數:

public abstract class GenericRepository<T, C> 
     where T : class 
     where C : System.Data.Linq.DataContext, new() 
    { 
     public C _db; 

     public GenericRepository() 
     { 
      _db = new C(); 
     } 


     public GenericRepository(C db) 
     { 
      _db = db; 
     } 


     public IQueryable<T> FindAll() 

    ... and other repository functions 
    } 

要使用它,我會derrive我的實際倉儲類:

public class TeamRepository : GenericRepository<Team, AppDataContext> { } 

現在,如果我嘗試用參數使用:

AppDataContext db = new AppDataContext(); 
TeamRepository repos=new TeamRepository(db); 

我得到的錯誤: 「App.Models.TeamRepository」不包含一個構造函數1個參數

因此,它看起來就像你不能繼承C#構造函數,那麼,你將如何讓我這個代碼可以調用:TeamRepository()或TeamRepository(db)

回答

6

派生類不會自動繼承任何基類的構造函數,您需要明確定義它們。然而

public class TeamRepository : GenericRepository<Team, AppDataContext> 
{ 
    public TeamRepository() : base() { } 
    public TeamRepository(AppDataContext db) : base(db) { } 
} 

請注意,如果基類定義(或明或暗地)可訪問的默認構造函數,派生類的構造函數會隱含調用它,除非構造函數中顯式調用。

+0

M:「派生類不會自動繼承基類」。應該是「派生類不會自動繼承基類的構造函數」。 – 2010-08-02 20:40:51

1

你是對的,C#中的構造函數不會冒泡成子類。你必須自己申報。在您的示例中,您需要爲每個存儲庫提供兩個構造函數。

相關問題