如何正确实现通过List <anotherinterface>继承接口的具体类

时间:2018-12-09 05:17:53

标签: c#

我有一个建议的字典项目模式,如下所示:

public interface IDataDictionary
{
    List<IDataDictionaryItem> DictionaryItems { get; set; }
}

而字典项为:

public interface IDataDictionaryItem
{
    Guid Guild { get; set; }

    int SequenceId { get; set; }

    string Title { get; set; }

    string Value { get; set; }

    string Description { get; set; }

    string Language { get; set; }

} 

当我尝试在像这样的具体类中实现这一点时:

public class HairColorDictionary : IDataDictionary
{
    public List<HairColor> DictionaryItems { get; set; }
}

具体实现的项目:

public class HairColor : IDataDictionaryItem
{
    public Guid Guild { get; set; }
    public int SequenceId { get; set; }
    public string Title { get; set; }
    public string Value { get; set; }
    public string Description { get; set; }
    public string Language { get; set; }
}

我在下面收到错误消息,但似乎无法绕过它。 有人可以启发我哪里出错了。

错误消息:

  

错误CS0738'HairColorDictionary'没有实现接口成员'IDataDictionary.DictionaryItems'。 'HairColorDictionary.DictionaryItems'无法实现'IDataDictionary.DictionaryItems',因为它没有匹配的返回类型'List'。

2 个答案:

答案 0 :(得分:2)

我了解您要了解的内容以及它不起作用的原因是因为该接口定义了一个非特定的集合(可以实现该接口),但是您正在尝试实现该接口成员以一种特定的方式。

如果确实必须执行此操作,则可以使用泛型。这是更新的位:

public interface IDataDictionary<T> where T : IDataDictionaryItem
{
    List<T> DictionaryItems { get; set; }
}

public class HairColorDictionary : IDataDictionary<HairColor>
{
    public List<HairColor> DictionaryItems { get; set; }
}

T允许您使用任何内容,而where T:...部分对此施加了约束。

请意识到这是您解决方案的潜在答案。我没有花时间去思考它的优点或缺点。

答案 1 :(得分:1)

在您的实现中,HairColorDictionary is-a IDataDictionary。所以我可以做一些坏事,例如:

IDataDictionary d = new HairColorDictionary();
d.DictionaryItems.add(blah);

这里的add方法期望的类型为IDataDictionaryItem,不一定是HairColor,因为d只是IDataDictionary而不是HairColorDictionary!所以我可以做类似的事情

class SkinColor : IDataDictionaryItem { ... }
IDataDictionaryItem s = new SkinColor();
d.DictionaryItems.add(s);

问题是最后一条陈述是否有效?这应该是有效的,因为add期望IDataDictionaryItem正确实现的SkinColor。但是那应该是无效的,因为实际的public List<HairColor> DictionaryItems只允许HairColor s,不能允许SkinColor s!

要消除所有这些混乱并保持严格的类型安全性,您必须遵循协方差和相反方规则。或者,您可以继续使用@TheMuffinMan不错的answer