在接口中实现接口属性

本文关键字:接口 属性 实现 | 更新日期: 2023-09-27 18:28:54

我有一个代码库,我想用于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"无法实现"IReport Params.SelectedStatus",因为它没有匹配的返回类型"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; }
    }
}

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

在接口中实现接口属性

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

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

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

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

这应该可以解决问题。

谢谢,Subhajit