另一个继承对象中的继承对象列表
本文关键字:继承 对象 列表 另一个 | 更新日期: 2023-09-27 17:57:26
我有五个模型:
- 抽象
Album
模型。 - 抽象
Artist
模型。 - 继承自
Album
的AlbumTypeOne
模型。 - 继承自
Artist
的ArtistTypeOne
模型。 - 继承自
Artist
的ArtistTypeTwo
模型。
我的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
添加到实际上是AlbumTypeOne
的Album
,您应该怎么做?(可能会引发异常。
或者,您只提供基本Artist
的 getter,并为每个派生的Album
类型提供强类型Add
方法,因为在添加艺术家的上下文中,您必须知道精确的Album
类型(而在迭代Album
艺术家的上下文中,例如为了打印曲目列表, Artist
的具体类型无关紧要——它们都有ToString()
等(。