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

本文关键字:继承 对象 列表 另一个 | 更新日期: 2023-09-27 17:57:26

我有五个模型:

  1. 抽象Album模型。
  2. 抽象Artist模型。
  3. 继承自AlbumAlbumTypeOne模型。
  4. 继承自ArtistArtistTypeOne模型。
  5. 继承自ArtistArtistTypeTwo模型。

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

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

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

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

它不喜欢这样。

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

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

如果要指定专辑类必须使用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继承的内容(。

您可能

Album 中公开了太多数据。与其公开列表,不如只使用抽象方法来遍历Artist,添加一个和删除一个(基本上重复List接口的相关部分(。每个派生类都实现这些访问方法,从私有或受保护的数据结构返回实际ArtistTypeOne...Two

诚然,这个解决方案不如斯科特的建议安全:如果有人试图将ArtistTypeTwo添加到实际上是AlbumTypeOneAlbum,您应该怎么做?(可能会引发异常。

或者,您只提供基本Artist的 getter,并为每个派生的Album类型提供强类型Add方法,因为在添加艺术家的上下文中,您必须知道精确的Album类型(而在迭代Album艺术家的上下文中,例如为了打印曲目列表, Artist的具体类型无关紧要——它们都有ToString()等(。