为了账号安全,请及时绑定邮箱和手机立即绑定

从派生类获取特定类型

从派生类获取特定类型

C#
拉莫斯之舞 2021-08-07 17:42:49
简介:我正在创建一个 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,但希望可能有另一种返回/识别派生类型的方法,这样我就不必在视图中全部查询它们。我目前的解决方案是始终返回基本类型,并为每个具体类型提供一个单独的视图,该视图只是将每个对象转换为正确的类型,只查询那些可能不同的类型。也许这就是最好的解决方案了,但感觉很不雅观。
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

可能的清洁选项是在每个文档必须实现的名为 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();

}


查看完整回答
反对 回复 2021-08-07
  • 3 回答
  • 0 关注
  • 160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信