2011-12-21 1 views
1
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. 
    } 

Этот код нарушает концепцию OO. Я думал, что если я получаю ClassB от InterfaceB, то я могу использовать ClassB в своем классеA вместо InterfaceB. VS не нравится это, он просит меня использовать InterfaceB вместо ClassB в ClassA. Есть ли другой способ сделать это.Как реализовать Интерфейс, который определяет элемент другого интерфейса

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

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

+0

ли 'DetailList' на интерфейсе Необходимость быть публично устанавливаемыми? –

+0

Да. Он должен быть общедоступным, я готов рассмотреть альтернативные варианты проектирования. У меня есть некоторые объекты домена, свойства которых определены интерфейсом A, и каждый объект домена будет иметь соответствующий объект, определенный интерфейсом B , например концерты (A) концерты (B) comedyshow (A) comedyshowlocations (B) – Neel

+1

Ваш код не компилируется. Но почему вы хотите это сделать? DetailList все еще может быть IEnum_e_rable , если вы хотите добавить к нему экземпляр ClassB. – CodeCaster

ответ

2

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

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# interface implemention - why does this not build?

+0

Это будет работать на то, что я пытаюсь сделать, я бы отметил это как ответ. Но дайте мне вторую мысль. – Neel

2

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

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

+0

Я подумал, что это будет проблемой, пока я пишу это, спасибо, что освободил от него какой-то дым. Но есть ли способ упоминания в интерфейсе A, который IEnumarable DetailList {get; задавать; } может быть InterfaceB или его реализация? – Neel