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

List of Inherited Objects in Another Inherited Object

我有五个模型:

  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; }

它不喜欢那样。

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

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

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 中暴露了太多数据。而不是制作列表public,应该只有迭代Artist的抽象方法,添加一个和删除一个(基本上重复List接口的相关部分)。每个派生的 class 实现这些访问方法,从私有或受保护的数据结构返回实际的 ArtistTypeOne...Two

诚然,此解决方案的类型安全性低于 Scott 的建议:如果有人试图将 ArtistTypeTwo 添加到实际上是 AlbumTypeOneAlbum,您应该怎么办? (可能抛出异常。)

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