Реализация свойств интерфейса в интерфейсах? - PullRequest
8 голосов
/ 23 марта 2012

У меня есть кодовая база, которую я хочу использовать как для 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; }
    }
}

Это больше строк кода для написания, но мне все равно нравится быть более явным.

Ответы [ 2 ]

7 голосов
/ 24 марта 2012

Я бы, вероятно, реализовал это со свойствами только для чтения. Лучше клиенту добавлять / удалять / обновлять элементы в существующей коллекции, а не заменять коллекцию в целом.

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; }
}
0 голосов
/ 14 августа 2018

Наткнулся на ту же проблему.Понял, что реализуемые интерфейсы также должны быть открытыми.

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

Это должно решить проблему.

Спасибо, Subhajit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...