2012-04-09 83 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

相关问题