另一个继承对象中的继承对象列表

时间:2016-07-18 16:55:56

标签: c# inheritance uwp abstract

我有五个模特:

  1. 抽象的Album模型。
  2. 抽象的Artist模型。
  3. 继承自AlbumTypeOne
  4. Album模型
  5. 继承自ArtistTypeOne
  6. Artist模型
  7. 继承自ArtistTypeTwo
  8. Artist模型

    我的Album模型上会有一个Artists列表。但是,我不知道艺术家是ArtistTypeOne还是ArtistTypeTwo,我不在乎。所以我将其添加到我的Album模型中:

    public abstract List<Artist> Artists { get; set; }
    

    但是当我尝试在AlbumTypeOne中覆盖此属性以进行JSON反序列化时:

    [JsonProperty("artists")]
    public override List<ArtistTypeOne> Artists { get; set; }
    

    它不是那样的。

    根据我对继承和抽象类的理解,这应该有效。我应该采取不同的方式吗?

2 个答案:

答案 0 :(得分:1)

如果您想指定专辑类必须使用的Artist哪个子类,那么您可以这样做:

public abstract class Album<TArtist> where TArtist : Artist
{
    public List<TArtist> Artists { get; set; }
}

where TArtist : Artist表示TArtist的泛型类型必须为Artist或从中继承的内容。

然后AlbumTypeOne可以声明为

public class AlbumTypeOne : Album<ArtistTypeOne>

Artists属性不需要是抽象的,您不需要覆盖它。继承自Album<ArtistTypeOne>指定泛型参数是什么。 Artists列表只接受ArtistTypeOne(或继承自ArtistTypeOne的内容。)

答案 1 :(得分:0)

您可能会在Album中公开过多的数据。不应该公开列表,而应该只有抽象方法来迭代Artist,添加一个并删除一个(基本上重复List接口的相关部分)。每个派生类都实现这些访问方法,从私有或受保护的数据结构返回实际的ArtistTypeOne...Two

不可否认,这个解决方案比Scott的建议更不安全:如果有人试图将ArtistTypeTwo添加到Album实际上是AlbumTypeOne,你该怎么办? (可能会抛出异常。)

或者,您只为每个派生的Artist类型提供基本Add和强类型Album方法的获取者,因为在添加艺术家的情况下,您必须知道精确的{{ 1}}类型(在迭代Album个艺术家的上下文中,例如为了打印一个轨道列表,Album的特定类型是无关紧要的 - 它们都有{{1等等。)。