2012-03-23 164 views
7

我有一个代码库,我想用于ASP.NET MVC和WPF/MVVM前端。业务对象作为接口实现,业务逻辑使用这些接口传递数据。在接口中实现接口属性?

说我有我的接口上实现IEnumerable属性。是否有可能让此接口的不同版本使用IEnumerable的不同实现?我试图完成的一个例子:

class Reporting 
{ 
    public bool RunReport(IReportParams Params); 
} 

interface IReportParams 
{ 
    IEnumerable<Guid> SelectedItems { get; } 
    IEnumerable<StatusEnum> SelectedStatuses { get; } 
} 

class MvcReportParams : IReportParams 
{ 
    public List<Guid> SelectedItems { get; set; } 
    public List<StatusEnum> SelectedStatuses { get; set; } 
} 

class WpfReportParams : IReportParams 
{ 
    public ObservableCollection<Guid> SelectedItems { get; set; } 
    public ObservableCollection<StatusEnum> SelectedStatuses { get; set; } 
} 

可以这样做吗?

编辑:我也应该问“怎么了”,因为当我尝试,我得到类似的错误:

“MvcReportParams”不实现接口成员“IReportParams.SelectedStatuses”。 “MvcReportParams.SelectedStatuses”无法实现“IReportParams.SelectedStatuses”,因为它不具备“System.Collections.Generic.IEnumerable”

的ObservableCollection匹配的返回类型和列表两种完全实现IEnumerable,因此这似乎不是不对我有意义。

最后编辑

嗯,有人贴出了答案,但他们删除它由于某种原因,所以我不能将其标记为解决方案。这是我最终做的:

interface IReportParams 
{ 
    IEnumerable<Guid> SelectedItems { get; } 
    IEnumerable<StatusEnum> SelectedStatuses { get; } 
} 

class MvcReportParams : IReportParams 
{ 
    // Properties that the modelbinder dims and sets up 
    public List<Guid> SelectedItems { get; set; } 
    public List<StatusEnum> SelectedStatuses { get; set; } 

    // Explicityly implement my interface 
    IEnumerable<Guid> IReportParams.SelectedItems 
    { 
     get { return SelectedItems; } 
    } 

    IEnumerable<StatusEnum> IReportParams.SelectedStatuses 
    { 
     get { return SelectedStatuses; } 
    } 
} 

class WpfReportParams : IReportParams 
{ 
    // Properties that my view dims and modifies 
    public ObservableCollection<Guid> SelectedItems { get; set; } 
    public ObservableCollection<StatusEnum> SelectedStatuses { get; set; } 

    // Explicityly implement my interface 
    IEnumerable<Guid> IReportParams.SelectedItems 
    { 
     get { return SelectedItems; } 
    } 

    IEnumerable<StatusEnum> IReportParams.SelectedStatuses 
    { 
     get { return SelectedStatuses; } 
    } 
} 

这是更多的样板代码行,但我喜欢更明确无论如何。

+0

绝对。是。 – 2012-03-23 19:59:39

+1

另外,你只需要尝试一下,而不是写一个关于它的问题就会更快。 – 2012-03-23 20:00:19

+0

@Boo正是我要说的Boo。也许这更多的是关于理解它为什么起作用(或不起作用)的问题,而不管它是否工作,因为编译器会尽快告诉你,无论它的回答速度多快:) – dreza 2012-03-23 20:03:12

回答

7

我可能会用只读属性来实现它。客户更好地在现有集合中添加/删除/更新项目,而不是完全替换集合。

interface IReportParams 
{ 
    IEnumerable<Guid> SelectedItems { get; } 
    IEnumerable<StatusEnum> SelectedStatuses { get; } 
} 

class MvcReportParams : IReportParams 
{ 
    public MvcReportParams() 
    { 
     SelectedItems = new Collection<Guid>(); 
     SelectedStatuses = new Collection<StatusEnum>(); 
    } 

    public IEnumerable<Guid> SelectedItems { get; private set; } 
    public IEnumerable<StatusEnum> SelectedStatuses { get; private set; } 
} 

class WpfReportParams : IReportParams 
{ 
    public WpfReportParams() 
    { 
     SelectedItems = new ObservableCollection<Guid>(); 
     SelectedStatuses = new ObservableCollection<StatusEnum>(); 
    } 

    public IEnumerable<Guid> SelectedItems { get; private set; } 
    public IEnumerable<StatusEnum> SelectedStatuses { get; private set; } 
}