我有五个模特:
Album
模型。Artist
模型。AlbumTypeOne
。Album
模型
ArtistTypeOne
。Artist
模型
ArtistTypeTwo
。Artist
模型
醇>
我的Album
模型上会有一个Artists
列表。但是,我不知道艺术家是ArtistTypeOne
还是ArtistTypeTwo
,我不在乎。所以我将其添加到我的Album
模型中:
public abstract List<Artist> Artists { get; set; }
但是当我尝试在AlbumTypeOne
中覆盖此属性以进行JSON反序列化时:
[JsonProperty("artists")]
public override List<ArtistTypeOne> Artists { get; set; }
它不是那样的。
根据我对继承和抽象类的理解,这应该有效。我应该采取不同的方式吗?
答案 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等等。)。