【问题标题】:Implementing interface properties in interfaces?在接口中实现接口属性?
【发布时间】:2018-08-14 18:25:19
【问题描述】:

我有一个要用于 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 和 List 都绝对实现了 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; }
    }
}

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

【问题讨论】:

  • 另外,您尝试一下会比写一个问题要快。
  • @Boo 正是我要说的 Boo。也许这更像是一个关于理解它为什么工作(或不工作)而不是它是否工作的问题,因为无论它的回答有多快,编译器都会比堆栈溢出更快地告诉你:)
  • 更新了问题主体,使其更清晰。
  • @Baconcheese 也许您会收到错误消息,因为在您的界面中,SelectedItemsSelectedStatuses 没有设置器
  • @Kamyar 没有在界面中声明的setter完全没问题。

标签: c# wpf asp.net-mvc-3 mvvm


【解决方案1】:

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

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; }
}

【讨论】:

    【解决方案2】:

    遇到了同样的问题。认为正在实现的接口也需要公开。

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

    这应该可以解决问题。

    谢谢, 苏哈吉特

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-22
      • 2016-08-20
      • 2010-12-08
      • 2016-01-28
      • 1970-01-01
      • 2011-04-17
      • 2012-10-26
      • 2017-06-29
      相关资源
      最近更新 更多