2012-04-09 76 views
1

我正在與以下mockable存儲庫模式試驗:爲什麼`Table`成員不能實現底層接口`ITable`成員?

public interface IEmployeeRepository 
{ 
    ITable<Employee> Employees { get; } 
} 

這表示能夠返回Employee對象的ITable的容器。我希望能夠根據存儲庫創建一個模擬對象,並讓我的Linq-to-Sql DataContext實現存儲庫接口。所以我想我可以只使用部分類聲明我DataContext類型來實現IEmployeeRepository,因爲它已經Table<Employee>類型的自動生成的成員Employees

public partial class MyDataContext : IEmployeeRepository { } 

我收到以下錯誤消息的結果:

'MyDataContext'沒有實現接口成員 'IEmployeeRepository.Employees'。 'MyDataContext.Employees'不能 實現'IEmployeeRepository.Employees',因爲它沒有 匹配返回類型'System.Data.Linq.ITable'。

Table<Employee>繼承ITable<Employee>,所以它不應該是一個合適的返回類型實現接口?

+0

可能重複[「接口沒有實現」返回派生類型時(http://stackoverflow.com/questions/1121283/interface-沒有實現的時候返回派生類型) – mellamokb 2012-04-09 18:06:13

回答

2

實現類的類型必須完全匹配接口類型。如果你不能改變的接口,你可以明確地實現它:

class EmployeeRepository : IEmployeeRepository 
{ 
    // existing property 
    public Table<Employee> Employees { get; } 

    // explicit IEmployeeRepository property 
    ITable<Employee> IEmployeeRepository.Employees { get { return Employees; } } 
} 
+0

+1我沒有想到這一點。我曾嘗試公開一個重命名的屬性'EmployeesRepository',它基本上做了同樣的事情並返回基礎屬性,但在這裏你可以保持名稱相同,我更喜歡。 – mellamokb 2012-04-09 18:05:36

相關問題