设计以避免派生类中的类型转换?

2023-12-11

public interface IBasePresenter
{
}
public interface IJobViewPresenter : IBasePresenter
{
}
public interface IActivityViewPresenter : IBasePresenter
{
}

public class BaseView 
{
    public IBasePresenter Presenter
    {
        get;
        set;
    }
}

public class JobView : BaseView
{
    public IJobViewPresenter JobViewPresenter
    {
        get { this.Presenter as IJobViewPresenter;}
    }
}

public class ActivityView : BaseView
{
    public IActivityViewPresenter ActivityViewPresenter
    {
        get { this.Presenter as IActivityViewPresenter;}
    }
}

假设我需要 BaseView 上的 IBasePresenter 属性。 现在这个属性由 JobView 和 ActivityView 继承,但如果我需要在这些派生类中引用 IJobViewPresenter 对象,那么我需要将 IBasePresenter 属性类型转换为 IJobViewPresenter 或 IActivityPresenter (我想避免)或在派生类上创建 JobViewPresenter 和 ActivityViewPresenter (如如上所示)。

我想避免在派生类中进行类型转换,并且仍然引用 IJobViewPresenter 或 IActivityViewPresenter,并且在 BaseView 中仍然具有 IBasePresenter。

我有办法实现它吗?


你可以这样做:

    public class BaseView<TPresenter>
        where TPresenter: IBasePresenter
    {
        TPresenter Presenter { get; set; }
    }

    public class JobView: BaseView<IJobViewPresenter>
    {

    }

如果您有需要引用 BaseView 的代码,您可以创建一个接口并公开基本演示器,如下所示:

    public interface IBaseView
    {
        IBasePresenter BasePresenter { get; }
    }

    public class BaseView<TPresenter> : IBaseView
        where TPresenter: IBasePresenter
    {
        TPresenter Presenter { get; set; }

        IBasePresenter IBaseView.BasePresenter
        {
            get { return Presenter; }
        }
    }

需要访问 BaseView 的类现在可以使用该接口,而不是直接使用 BaseView。您也可以公开需要在其中使用的任何其他基本服务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计以避免派生类中的类型转换? 的相关文章

  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 在jquery中向上/向下移动

    我有 5 个跨度 我试图在 jquery 中将它们向上 向下移动 交换位置 a href Up a a href Down a span Test1 span br span Test2 span br span Test3 span br
  • Fortran 2003 中参数化派生类型的问题

    我正在自学 Fortran 2003 以便将其用于我目前正在进行的一个研究项目 我已经习惯了 Fortran 90 但这个项目需要使用参数化类型 所以我要转向 2003 我正在关注这个网站的描述了如何定义参数化类型 并根据网站的示例编写了一
  • 处理 Google Play 服务更新消息

    我在我的应用程序中使用 googleservices 版本 8 3 但是 当我在旧设备 LG II Optimus 上下载应用程序时 它向我显示以下消息 除非您更新 Google Play 否则此应用程序将无法运行 服务 我接受并更新了谷歌
  • 使用 powershell 从 HTML 网站抓取图像链接

    我想批量下载一些图片库 这些图像是免费提供的 无需任何许可 我一生都无法让它发挥作用 这是我到目前为止所拥有的 pattern 吐出的是整个 HTML 行 而不仅仅是图像链接 有什么可以给我的指点吗 出于测试目的 该循环设置为仅运行一次 循
  • Oracle 透明数据加密未解密访问

    我可以按照以下所有陈述都成立的方式设置 Oracle 数据库吗 a 某些列 可能是所有列 都已加密 因此对数据库文件的直接文件访问将不允许攻击者检索任何记录 b 加密列对于授权用户透明地解密 其中授权发生 例如通过拥有一定的角色或特权 c
  • 重载一元运算符& 有哪些合理的理由?

    好吧 我已经受到启发去做一些头部冲孔 好像超载了operator 导致不小的疼痛 存在哪些合法的超载情况 不能说我曾经这样做过 我似乎记得类似智能指针类的东西 它覆盖了operator 因为它想要返回所包含指针的地址而不是智能指针对象的地址
  • 计算随机生成的数字列表中的频率

    我生成了 0 9 的 100 个随机数 我应该计算每个数字出现的次数 将其存储在 10 个整数的数组中并进行计数 这是我到目前为止所拥有的 我无法弄清楚计数部分 Random r new Random int integers new in
  • 对单词数组进行排序 - 非英文字母 + 双字符字母 PHP

    我想按字母顺序对单词数组进行排序 不幸的是 在我的语言 克罗地亚语 中 有双字符字母 例如 lj nj d 并且 php 未正确排序字母sort函数 例如 这是正确排序的克罗地亚字母表 还有一些英文字母 alphabet array a b
  • java中如何将图像转换为透明图像

    如何将图像的白色背景转换为透明背景 谁能告诉我该怎么做 谷歌的第一个结果是这样的 使颜色透明http www rgagnon com javadetails java 0265 html 它使图像的蓝色部分透明 但我确信您可以调整它以使用白
  • 如何将图库中的图像存储到 SQLite 数据库中

    我已经尝试使用此代码将图像从图库上传到我的应用程序中的 sqllite 数据库 但是当我的应用程序尝试打开图库时 它给出强制关闭错误 我不知道问题是什么 请帮助我并提前感谢 public class ImagggggggActivity e
  • 转换后的 mp4 h264 基线格式加载时间较长

    我已将视频转换为 mp4 x264 基线格式 并且它可以在所有 PC 手机上正常工作 问题是加载视频需要很长时间 而谷歌搜索发现 ffmpeg 会在视频的末尾处转换并设置索引文件因此它会加载到最后阅读 然后播放视频 因此任何缩短加载时间的建
  • Iterator 类和 foreach 构造之间的性能差异

    我正在运行以下代码 但有时在运行它时会出现某种并发异常 ArrayList
  • 计算青蛙到达河对岸所需的最少跳跃次数

    我正在处理下面提供的 Codility 问题 斐波那契数列使用以下递归公式定义 F 0 0 F 1 1 F M F M 1 F M 2 if M gt 2 一只小青蛙想要到河的对岸 青蛙最初位于河的一侧 位置 1 并想要到达另一侧 位置N
  • 检查 PHP 中的多个变量(布尔值)

    我在我的代码中使用它 但我认为它可以改进并且可以用更简单的方式完成 if phaseOne true phaseTwo true phaseThree true 你可以这样做 if phaseOne phaseTwo phaseThree
  • 在 Pandas 中按组回填列

    我有一个类似的csv A B C D 1 2 1 2 30 100 1 2 40 100 4 5 4 5 60 200 4 5 70 200 8 9 第 1 行和第 4 行中缺少 C 值 NaN 我想分别从第 2 行和第 5 行获取它们的值
  • 如何在GroupLayout Java中设置Jframe背景图片

    我试图为我的框架设置背景图像 但它不起作用 我尝试了这个链接 在 JFrame 中设置背景图像 代码 setContentPane new JLabel new ImageIcon ImageIO read new File Images
  • split 不返回空元素

    为什么这些不都返回bbb perl e a print map b split a lt
  • 过滤器功能 dplyr 似乎不起作用[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 假设我在 R Studio 中加载了一个名为 exprCore1 的数据框 df 如下所示 measure qid value 1 p5 1 0 2 2 p100 1 0 8
  • Angular2路由器保留查询字符串

    我编写了一个使用路由器的 Angular2 v2 0 1 应用程序 该网站加载了多个查询字符串参数 因此完整的 URL 最初如下所示 https my application com param1 val1 param2 val2 para
  • 设计以避免派生类中的类型转换?

    public interface IBasePresenter public interface IJobViewPresenter IBasePresenter public interface IActivityViewPresente