另一个继承对象中的继承对象列表
List of Inherited Objects in Another Inherited Object
我有五个模型:
- 抽象
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; }
它不喜欢那样。
根据我对继承和抽象的理解 类,这应该可行。有什么不同的方法吗?
如果您想指定专辑 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
添加到实际上是 AlbumTypeOne
的 Album
,您应该怎么办? (可能抛出异常。)
或者您只为基本 Artist
提供吸气剂,为每个派生 Album
类型提供强类型 Add
方法,因为在添加艺术家的上下文中,您必须知道精确的Album
类型(在迭代 Album
的艺术家的上下文中,例如为了打印曲目列表,Artist
的特定类型是无关紧要的——他们都有 ToString()
等)。
我有五个模型:
- 抽象
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; }
它不喜欢那样。
根据我对继承和抽象的理解 类,这应该可行。有什么不同的方法吗?
如果您想指定专辑 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
添加到实际上是 AlbumTypeOne
的 Album
,您应该怎么办? (可能抛出异常。)
或者您只为基本 Artist
提供吸气剂,为每个派生 Album
类型提供强类型 Add
方法,因为在添加艺术家的上下文中,您必须知道精确的Album
类型(在迭代 Album
的艺术家的上下文中,例如为了打印曲目列表,Artist
的特定类型是无关紧要的——他们都有 ToString()
等)。