首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在接口中实现接口属性?

在接口中实现接口属性?
EN

Stack Overflow用户
提问于 2012-03-23 19:48:21
回答 2查看 7.3K关注 0票数 8

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

假设我的接口上有一个实现IEnumerable的属性。这个接口的不同版本是否可以使用不同的IEnumerable实现?我正在努力完成的一个例子是:

代码语言:javascript
复制
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.SelectedStatus‘。'MvcReportParams.SelectedStatuses‘不能实现'IReportParams.SelectedStatuses’,因为它没有匹配的返回类型'System.Collections.Generic.IEnumerable‘

ObservableCollection和List都绝对实现了IEnumerable,所以这对我来说似乎没有意义。

最后编辑

有人发了答案,但出于某种原因他们把它删除了,所以我不能把它标记为解决方案。以下是我最后所做的:

代码语言:javascript
复制
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; }
    }
}

这是更多的样板代码要写,但我喜欢更明确。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-23 20:45:52

我可能会用只读属性来实现这一点。更好的做法是客户端在现有集合中添加/删除/更新项,而不是完全替换集合。

代码语言:javascript
复制
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; }
}
票数 8
EN

Stack Overflow用户

发布于 2018-08-14 10:25:19

遇到了同样的问题。显示正在实现的接口也需要是公共的。

代码语言:javascript
复制
public interface IReportParams
{
    IEnumerable<Guid> SelectedItems { get; }
    IEnumerable<StatusEnum> SelectedStatuses { get; }
}

这应该能解决问题。

谢谢你,Subhajit

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9845620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档