从派生类获取特定类型

简介:我正在创建一个 MVC 应用程序,我需要在其中显示各种类型的文档,其中一些文档比其他文档包含更多的作者信息。


我想做的是:我的方法是拥有一个通用的“查看文档”视图,它以传递给它的对象的形状/类型所指示的格式动态显示文档。


示例:一个简单的文档将被加载到 SimpleDocumentViewModel 中,并按原样显示。但是,我想将更大类型的文档加载到 ExtendedDocumentViewModel 中,并附带有关文档和作者的附加信息。然后,视图将根据它接收到的对象显示适当的数据。


我现在所处的位置:在这种情况下,我创建了以下接口和类,但我对如何在派生类中返回/识别更具体的返回类型感到困惑。


abstract class BaseDocumentViewModel : DocumentViewModel, IDocumentViewModel

{

    public int DocumentId { get; set; }

    public string Body { get; set; }

    public IAuthorViewModel Author { get; set; }

}


class SimpleDocumentViewModel : BaseDocumentViewModel

{

}


class ExtendedDocumentViewModel : BaseDocumentViewModel

{

    public new IAuthorExtendedViewModel Author { get; set; }

}


interface IAuthorViewModel

{

    int PersonId { get; set; }

    string Name { get; set; }

}


interface IAuthorExtendedViewModel : IAuthorViewModel

{

    int ExtraData { get; set; }

    int MoreExtraData { get; set; }

}

问题:所以我的问题是;如何最好地从完全实现的类中获取特定类型,或者我是否需要返回基本类型并在视图中全部查询?或者我是不是疯了,需要回到绘图板?


编辑:


我知道c# 不支持返回类型 covarience,但希望可能有另一种返回/识别派生类型的方法,这样我就不必在视图中全部查询它们。


我目前的解决方案是始终返回基本类型,并为每个具体类型提供一个单独的视图,该视图只是将每个对象转换为正确的类型,只查询那些可能不同的类型。也许这就是最好的解决方案了,但感觉很不雅观。


拉莫斯之舞
浏览 161回答 3
3回答

九州编程

可能的清洁选项是在每个文档必须实现的名为 GetView 的接口中只具有一个签名。这样每个文档类型都有自己的实现函数的方式,调用函数知道每个文档都有一个函数 GetView。如果每个文档都有独特的查看文档的方式,则此方法将很有效。但是,如果某些文档共享相同的获取视图的方式,那么我是否建议将每个视图类型创建到它们自己的类中,并且您可以将视图类型分配给每个文档。我建议研究策略模式。第一个建议:class SimpleDocumentViewModel : IAuthorViewModel{      view GetView()      {          ... do document specific stuff          ... return view      }}class ExtendedDocumentViewModel : IAuthorViewModel{      int ExtraData { get; set; }      int MoreExtraData { get; set; }      view GetView()      {          ... do document specific stuff          ... return view      }}interface IAuthorViewModel{    view GetView();}第二个建议:class SimpleDocumentViewModel : IAuthorViewModel{      public viewType1 view {get;set;}      public SimpleDocumentViewModel(viewType1 viewIn,etc...)      {          view = viewIn;      }       view GetView()      {          return view.GetView();      }}class ExtendedDocumentViewModel : IAuthorViewModel{      int ExtraData { get; set; }      int MoreExtraData { get; set; }      public viewType2 view {get;set;}      public ExtendedDocumentViewModel(viewType2 viewIn,etc...)      {          view = viewIn;      }       view GetView()      {          return view.GetView(ExtraData,MoreExtraData);      }}interface IAuthorViewModel{    view GetView();}
打开App,查看更多内容
随时随地看视频慕课网APP