【问题标题】:How to implement Interface which defines element of another Interface如何实现定义另一个接口元素的接口
【发布时间】:2011-12-21 22:34:09
【问题描述】:
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 定义的域对象,每个域对象都有由接口 B 定义的相应对象 例如 音乐会(A) 音乐会地点(B) 喜剧表演(A) 喜剧表演地点(B)

如果您认为我不够清楚,请随时提出更多问题。
提前致谢

【问题讨论】:

  • 接口A上的DetailList是否需要公开设置?
  • 是的。它必须是可公开设置的,我愿意考虑替代设计选项,我有一些属性由接口 A 定义的域对象,每个域对象都有由接口 B 定义的相应对象,例如 Concert(A) Concertlocations(B) comedyshow (A) 喜剧表演地点(B)
  • 您的代码无法编译。但是你为什么要这样做呢?当您要向其添加 ClassB 实例时,DetailList 仍然可以是 IEnum_e_rable。

标签: c# inheritance interface ienumerable


【解决方案1】:

你可以这样做:

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?

【讨论】:

  • 这适用于我正在尝试做的事情,我会将其标记为答案。但请重新考虑我的设计。
【解决方案2】:

接口 A 只是说 IEnumarable&lt;InterfaceB&gt; DetailList { get; set; } 必须存在于任何实现它的类中,而 InterfaceB 正是 IEnumerable 的泛型类型,而不是它的实现之一。

B 类不如接口 B 通用,因此它不允许您以这种方式使用它是完全合乎逻辑的。

【讨论】:

  • 我在写它的时候认为这会是一个问题,感谢您为我清除了一些烟雾。但是有没有办法在接口 A 中提到 IEnumarable DetailList { get;放; } 可以是 InterfaceB 或其实现?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2014-09-16
  • 1970-01-01
  • 2021-11-01
  • 2016-04-28
  • 2022-11-28
  • 2017-07-09
相关资源
最近更新 更多