2011-12-21 132 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概念。我想如果我从InterfaceB派生ClassB,那么我可以在ClassA中使用ClassB而不是InterfaceB。 VS不喜欢这个,它要求我在ClassA中使用InterfaceB而不是ClassB。 有没有其他的方式去做这件事。如何实现定义另一个接口元素的接口

我愿意考虑替代设计方案,我有一些域对象,其属性由接口A被定义,并且每个域对象将具有对应的通过接口乙 例如 音乐会(A)concertlocations(B) comedyshow定义的对象(A)comedyshowlocations(B)

如果您觉得我不够清楚,请随时提出更多问题。
由于提前

+0

不'DetailList'在接口一个需要被公开设定? – 2011-12-21 23:06:10

+0

是的。它必须是公开可设置的,我愿意考虑替代设计方案,我有一些域对象,其属性由接口A被定义,并且每个域对象将具有对应通过接口B中定义对象 例如 音乐会(A)concertlocations(B ) comedyshow(A)comedyshowlocations(B) – Neel 2011-12-22 01:04:18

+1

您的代码不会编译。但你为什么要这样做?当您想要为其添加ClassB实例时,DetailList仍然可以是IEnum_e_rable 。 – CodeCaster 2011-12-22 01:07:43

回答

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 2011-12-22 15:53:21

2

接口A只是说,IEnumarable<InterfaceB> DetailList { get; set; }具有存在于任何类,也就是实现它,用准确InterfaceB是通用类型的IEnumerable,而不是它的一个implementaions。

B类不如界面B一般,因此完全合乎逻辑的是它不允许你以这种方式使用它。

+0

我认为这将是一个问题,而我写的,感谢清理一些烟雾围绕我。 但是,有没有办法在接口A一提的是,IEnumarable DetailList {获得;组; } 可以是InterfaceB还是其实现? – Neel 2011-12-21 22:48:52

相关问题