如何避免 GUI 控件和域对象之间的并行继承层次结构

2024-03-21

我正在用 C# 开发 Windows 窗体应用程序。我正在使用 MVP 设计模式。在 GUI 中,用户可以操作打印机对象,并且需要有自定义控件来向用户表示打印机对象。

有一个代表打印机的类层次结构。底层有一个抽象 Printer 类。然后是一个抽象的 InkJetPrinter 类和一个抽象的 LaserPrinter 类,每个类都继承自 Printer。具体类代表打印机的不同品牌和型号,并继承自 InkJetPrinter 或 LaserPrinter。

GUI 中代表打印机的每个 UserControl 类都需要具有特定于打印机类型的特性和功能。例如,喷墨打印机可能有一个显示墨水量的显示屏,某种型号的激光打印机可能有可以通过控制器上的附加按钮访问的特殊功能,等等。

我没有看到比使 UserControl 类的继承层次结构与 Printer 类的继承层次结构并行的更好的处理方法。有更好的方法吗?


在此设计中,您可能需要 LaserPrinterControl 和 InkJetPrinterControl,但它们不需要从 PrinterControl 派生。例如,您可以同时指定一个“PrinterControl”子控件。

缺点是粘合代码较多,但优点是您可以完全控制 PrinterControl 的行为。

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

如何避免 GUI 控件和域对象之间的并行继承层次结构 的相关文章

随机推荐

  • 使用 Proguard 处理 Jackson 库后混淆时出错

    在使用 Proguard 搜索了与混淆问题相关的各种查询之后 我觉得我可能是only一个有这个特殊问题的人 因此 该帖子 我有一个相当标准的 Android 应用程序 它使用基于 JSON 的 REST 调用来交换数据 我利用Jackson
  • 在有关 Android 工具链的“flutter doctor”中显示错误

    显示有关 android 工具链的错误 Android toolchain develop for Android devices Android SDK version 29 0 3 Android license status unkn
  • 什么是 Ruby <=>(宇宙飞船)运算符?

    什么是红宝石 lt gt 宇宙飞船 操作员 该运算符是否由其他语言实现 The 宇宙飞船操作员 https ruby doc org core 3 0 0 Comparable html将返回1 0 or 1取决于左参数相对于右参数的值 a
  • Qt 且没有 moc_*.cpp 文件

    我正在开发一个简单的 Qt 4 应用程序并制作自己的对话框 我子类化了QDialog 插入Q OBJECT类声明块中的宏 并且 我明白了 链接器错误 未定义对 MyDialog vtable 的引用 并且没有 moc MyDialog cp
  • django-mssql 无法在 Apache 中使用 mod_wsgi 工作,但在开发服务器中工作正常

    我有一个 Django 应用程序 使用 django mssql 与 SQL Server 进行通信 这在开发服务器 runserver 中工作得很好 但在 Apache mod wsgi 下 我在尝试查找确实存在的 dll 时遇到了与它相
  • 在 UWP 中创建文件和文件夹

    我查看了很多 stackoverflow 帖子和文章 但仍然无法在 UWP 中创建文件 在 WPF 中这确实很容易 但 UWP 的工作方式有所不同 我在清单文件中添加了以下内容
  • 数据库独立的行级安全解决方案

    有人知道 Java C 数据库独立授权库吗 该库应支持跨公司组织结构的读 写 删除 插入操作 像这样的东西 用户可以查看所有文档 用户可以输入分配给他的单位的新文档 用户可以更改分配给他的单位和所有下属单位的所有文档 用户可以删除分配给他的
  • 计算存储过程的结果

    我有一个返回 ID 名称 描述的存储过程 并且不接受任何输入参数 但是 我对得到多少结果感兴趣 我期待这样的工作 SELECT COUNT FROM EXEC MyStoredProcedure 但我在 Sql Server Managem
  • LVDiff 在 Git 中不起作用

    我正在尝试从元差异套件中获取 lvdiff 以与 Git 一起使用 我的 gitconfig 看起来像这样 gui recentrepo C Users Tanner Desktop FIRST 2010 Beta Java LoganRo
  • GPS定位无服务

    我是一名新开发人员 有一个简单的问题 我已经四处搜索 但尚未找到明确的答案 简而言之 我正在开发一个需要能够使用 GPS 的应用程序 然而 诀窍是我想使用 GPS 来获取手机的位置 即使它们没有运营商服务 话虽如此 我有两个问题 是否可以通
  • 未经授权暴露hangfire

    有没有办法在 IIS 中公开 Hangfire 而无需配置授权 在这种特定情况下 仪表板应该打开 但在访问它时 不是在调试中 它会返回 401 代码 我认为你应该能够编写一个自定义实现IDashboardAuthorizationFilte
  • 如何动态插入Vue组件?

    许多面板 产品 以多行和多列的形式显示在一个页面中 我使用的是 Vue 2 面板是组件 现在 单击一个面板时 我想在该面板的行下方显示该面板的详细信息 这与谷歌图像搜索类似 例如 在上图中 如果我单击 s1 s2 或 s3 中的任何一个 大
  • 如何使用多个$条件对查询进行分组?

    我想像下面这样查询 但这只包含一个 cond 如何查询两个 cond collection aggregate match id in ids group id someField count sum cond eq otherField
  • 产生随机波函数

    我需要在 matplotlib 中生成一条随机曲线 例如 我的 x 值是从 1 到 1000 我不想生成分散的随机 y 值 我需要一条平滑的曲线 就像某种非常扭曲的正弦曲线 具有不同的幅度和波长 是否已经存在一些东西可以让我轻松地做到这一点
  • 如何从 gWidget 和处理程序返回值?

    我正在尝试为 R 包开发 GUI 使用 gWidgets 我的计划是构建一个保存数据的主窗口 并使用按钮为每个函数调用小型 gui 包装器 不幸的是 我陷入了一个基本 问题 我不知道如何传输数据 问题 如何在不同的窗口之间正确发送数据 如何
  • 让聊天机器人 (wit.ai) 回复它没有正确的答案

    我在用Wit ai对于我的聊天机器人 问题是我的机器人总是试图回答一些问题 只有当我的机器人真正理解所问的内容时 我才会做出回答 我知道这是可能的 但如果我有一个回复很少的机器人 它似乎总是选择其中一个回复 即使它被问到完全不同的问题 我想
  • 连接到 docker-compose mysql 容器拒绝访问,但运行相同映像的 docker 不会

    我在连接到使用 docker compose 启动的 mysql docker 容器时遇到一些问题 这是一篇很长的文章 抱歉 这是我的 docker compose yml 文件 db image mysql 5 7 ports 3306
  • 为什么静态链接的可执行文件中有全局偏移表和过程链接表?

    我已经阅读了大量有关动态链接器重定位和位置无关代码的内容 包括过程链接表和全局偏移表 我不明白为什么静态链接的可执行文件需要 PLT 和 GOT 我在 ubuntu x86 64 机器上编译了一个 hello world 程序 当我转储节标
  • 在 Linux Mint 上安装 pyttsx3

    我成功安装了 pyttsx3pip install pyttsx3我写了以下代码 import pyttsx3 def speak text engine pyttsx3 init engine say text engine runAnd
  • 如何避免 GUI 控件和域对象之间的并行继承层次结构

    我正在用 C 开发 Windows 窗体应用程序 我正在使用 MVP 设计模式 在 GUI 中 用户可以操作打印机对象 并且需要有自定义控件来向用户表示打印机对象 有一个代表打印机的类层次结构 底层有一个抽象 Printer 类 然后是一个