Как реализовать интерфейс, который определяет элемент другого интерфейса - PullRequest
1 голос
/ 22 декабря 2011
Interface A
    {
      string x {get;set;}
      IEnumarable<InterfaceB> DetailList { get; set; }
    }
    Interface B
    {
     int z;
     int y;
    }

    Class B :Interface B
    {
      implements z;
      implements y;
    }
    Class A :Interface A
    {
      implements x;
      IEnumarable<ClassB> DetailList {get;set;} // This line is giving trouble.
    }

Является ли этот код нарушением концепции ОО.Я думал, что если я получу ClassB от InterfaceB, то я могу использовать ClassB в моем ClassA вместо InterfaceB.VS не нравится это, он просит меня использовать InterfaceB вместо ClassB в ClassA.Есть ли другой способ сделать это?

Я готов рассмотреть альтернативные варианты проектирования, у меня есть некоторые доменные объекты, свойства которых определены интерфейсом A, и у каждого доменного объекта будет соответствующий объект, определенный интерфейсом B, например концерт (A) концертная локация (В) comedyshow (A) комедийные шоу (B)

Не стесняйтесь задавать больше вопросов, если вы считаете, что я недостаточно ясен.
Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Вы можете это:

public interface InterfaceA<T> where T : InterfaceB
{
    string x {get;set;}
    IEnumerable<T> DetailList { get; set; }
}

public interface InterfaceB
{
    int z { get; }
    int y { get; }
}

public class ClassB : InterfaceB
{
    public int z { get; private set; }
    public int y { get; private set; }
}

public class ClassA : InterfaceA<ClassB>
{
    public int z { get; private set; }

    public string x { get; set; }

    public IEnumerable<ClassB> DetailList {get;set;} 
}

но я не уверен, что это желательно для вас?

см. Здесь для получения дополнительной информации: Реализация интерфейса c # - почему это не собирается?

2 голосов
/ 22 декабря 2011

Интерфейс A просто говорит, что IEnumarable<InterfaceB> DetailList { get; set; } должен присутствовать в любом классе, который его реализует, причем именно InterfaceB является универсальным типом для IEnumerable, а не его реализацией.

Класс B является менее общим, чем интерфейс B, поэтому совершенно логично, что он не позволяет использовать его таким образом.

...