2012-03-23 154 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; } 
}