模板继承的 UML 图

2024-02-28

在我的库的文件中,我有一个继承自模板的类。

我的代码示例:

class data{ ... };
class dataA: public data{ ... };
class dataB: public data{ ... };

//inheritance from a template

template<typename dataHandler>
class myClass: public dataHandler{ ... };

模板dataHandler在我的代码中可以是data, dataA or dataB.

我想为该类编写一个 UML 图myClass明确对先前数据类型的继承。


UML 模板的限制

您遇到的问题与 UML 处理用绑定元素替换模板参数的方式有关。这主要是由符号引起的,而不是由继承引起的。

事实上,如果你有一个myClass只有组成:

template<typename T>
class myClass { 
   T a;
   vector<T> v; 
   ...
}; 
using myClassDataA = myClass<dataA>;

您可以在 UML 中以独立的方式表示它,模板参数仅在模板类中使用:

但据我所知,如果您想将 T 属性显示为关联结束,则无法模板化同一类的等效表达式:

对于继承来说,也是同样的问题:继承的类在模板类之外。但在这里,没有符号快捷方式可以神奇地将其包含在模板框中。

视觉解决方法?

如果它主要用于 C++ 设计的图形通信,您可以直观地建议一组类都依赖于相同的模板参数。在我上面的构图示例中,它看起来像:

对于您的继承情况,它将是:

但请记住,有UML 中没有定义语义为了那个原因。例如,没有任何东西可以让 UML 工具识别myClass<dataA>这将继承自dataA。换句话说,任何 UML 代码生成器或工具都无法通过模型生成有意义的内容,但其他 C++ 程序员将完全理解您的意思。

更好的设计?

虽然您的模板构造非常强大,但它也很容易出错,因为您可以在同一模板的实例化上执行的操作取决于绑定。这意味着模板的每个实例都需要不同的测试用例。

因此值得提醒一下一般原则:

优先选择组合而不是继承 https://en.wikipedia.org/wiki/Composition_over_inheritance

所以只需创建一个dataHandler模板类中的成员,并将一组明确的操作转发给该成员,这些操作对于所有处理程序来说都是通用的。然后,您可以毫无困难地使用现有的 UML 语义在 UML 中对其进行建模。

我知道,它不太灵活;但我想转发操作上的一点额外麻烦,会为你以后省去很多麻烦。如果你确实需要更多的灵活性,你也可以考虑反转继承使用CRTP https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern但这一次有很多更清晰、明确的 UML 建模 https://stackoverflow.com/q/60145328/3723423.

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

模板继承的 UML 图 的相关文章

  • 使用 #pragma Once 和 #ifndef 时出现 VS 2010 C++ LNK2005 错误

    1 gt Deck obj error LNK2005 class Card card card 3VCard A already defined in Card obj 1 gt PokerTester obj error LNK2005
  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • std::make_pair 与浮点数组(float2,无符号整数)

    我有一个用 float2 unsigned int 对模板化的向量 例如 std vector
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 模板与非模板类,跨编译器的不同行为

    我在一些应用程序中使用编译时计数器 它确实很有用 昨天我想用 gcc 编译一个程序 我之前使用的是 msvc 并且计数器的行为在模板类中发生了变化 它在模板类中不再工作 过于简化的代码 Maximum value the counter c
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 意外的 const 引用行为

    include
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • 在 Nuget 包中公开 Azure Functions

    我们希望在我们的不止一种产品中实现可重用的功能 我想做的是 创建一个包含一个或多个 Azure Functions 附加了 FunctionNameAttribute 的静态方法 的 C 项目 将此项目转为NuGet包 在 Azure Fu
  • 从前序和后序列表重建树

    考虑这样一种情况 您有两个节点列表 您只知道其中一个是某棵树的前序遍历的表示 另一个是同一棵树的后序遍历的表示 我相信可以从这两个列表精确地重建树 并且我认为我有一个算法可以做到这一点 但尚未证明 由于这将是硕士项目的一部分 我需要绝对确定
  • Node Mongo Native - 如何判断游标何时耗尽?

    的文档节点 mongodb nativecollection find 功能 https github com mongodb node mongodb native find说它创建一个游标对象 该对象延迟返回匹配的文档 此外 游标的基本
  • tkinter 小部件的 cnf 参数

    所以 我正在研究代码here http svn python org projects python branches pep 0384 Lib tkinter init py在每个班级 几乎 我都看到一个争论cnf 到构造函数 但除非我错
  • org-mode取消\hypersetup后有什么影响?

    我用自己的序言在 org 模式下制作 pdf 但生成的 PDF 或 tex 文件始终显示以下信息 format hypersetup n pdfkeywords s n pdfsubject s n pdfcreator s n org e
  • 如何创建具有延迟的可观察对象

    Question 出于测试目的 我正在创建Observable替换实际 http 调用返回的可观察对象的对象Http 我的可观察对象是使用以下代码创建的 fakeObservable Observable create obs gt obs
  • 什么是 gitlab runner

    我想我从根本上错过了一些东西 我是 CI CD 新手 正在尝试使用 gitlab 建立我的第一个管道 该项目是一个预先存在的 PHP 项目 我还不想清理它 目前我已经将整个东西推入了 docker 容器 并且它与谷歌云的 mysql 数据库
  • 模拟跨上下文连接--LINQ/C#

    问题是这样的 我有 2 个数据上下文 我想对其进行联接 现在我知道 LINQ 不允许从一个上下文连接到另一个上下文 并且我知道有 2 种可能的解决方案是创建单个数据上下文或有 2 个单独的查询 这就是我现在正在做的事情 然而我想做的是 模拟
  • 如何管理 git 中的重叠存储库,包括同一目录中的文件?

    我有一个复杂的存储库 有时代码段之间的逻辑边界跨越目录边界 有时目录 X 中的单个文件确实需要与目录 Y 中的文件一起使用 例如 假设我有一个如下所示的中央存储库 a foo a bar b baz1 b baz2 我希望我的本地存储库最终
  • 如何通过 Curl 和 PHP 发送 SOAP XML?

    这已经困扰我好几天了 我正在尝试通过 Curl 发送 SOAP 帖子 但我总是收到 无法连接到主机 错误 但是 我真的不知道如何解决 我有一个 ASP 版本 它可以在相同的 URL 和数据下正常工作 我认为这只是 PHP Curl 的事情
  • AWS Lambda Python 3.7 运行时异常日志记录

    使用 Python 3 7 运行时时引发的未处理异常似乎不会像在 Python 3 6 中那样记录到 CloudWatch 如何在 Python 3 7 中设置记录器来捕获此信息 还发布在 AWS 论坛上 https forums aws
  • pytorch index_put_给出运行时错误:“索引”的导数未实现

    这是后续问题这个问题 https stackoverflow com q 65584330 3337089 我尝试使用index put 如建议的答案 https stackoverflow com a 65584479 3337089 但
  • 当有很多要发送的值时,将值传递给函数的最佳方法是什么?

    当您必须将许多值传递给函数并且其中一些值可能是可选的时 定义方法签名的最佳方法是什么 将来 我可能必须传递更多变量或减去一些传递给函数的值 例如 电话和地址可选 function addInfo name dob phone address
  • 针对 R+(版本 30 及更高版本)要求已安装 APK 的 resources.arsc 未压缩存储并在 4 字节边界上对齐

    我正在尝试将 android 目标 API 从 29 更新到 30 我已更新 compileSdkVersion 30 targetSdkVersion 30 buildToolsVersion 30 0 2 该应用程序与zipalign
  • cocoa 应用程序中提示 root 访问权限

    我希望我的程序以要求 root 访问权限的提示 警报开始 用户必须输入密码 然后应用程序就会启动 我一直在环顾四周 但我不太确定该怎么做 非常感谢您的帮助 Thanks 这是苹果公司关于此事的文档 http developer apple
  • 如何消除TPaintBox右边缘的闪烁(例如调整大小时)

    总结 假设我有一个 TForm 和两个面板 面板对齐 alTop 和 alClient alClient面板包含一个TPaintBox 其OnPaint涉及绘图代码 组件上 DoubleBuffered 的默认值为 false 在绘制过程中
  • 为什么 Icon Composer 2.4 不再支持 1024x1024 尺寸的图标?

    Xcode 4 3 3中的图标编辑器2 2支持1024x1024的icns 然而 对于 Icon Composer 2 4 它不再支持这一点 这很讽刺 因为苹果推动了视网膜显示屏mbp 并要求新提交的应用程序使用1024x1024图标 但图
  • Android 手风琴/手风琴/折叠动画

    我正在尝试创建一个交互式手风琴 手风琴 折叠动画 以便视图在交互时自行折叠 展开 以同样的方式折叠视图 但两侧都折叠 我认为我可以做到的方法是重写 onDraw 方法 以某种方式复制画布或画布上的信息 然后绘制以一种方式旋转的画布的前半部分
  • 不支持表/列名称中的方括号?

    postgresql 是否不支持表名 列名或数据类型中的方括号 在 pgadmin 中运行查询时出现以下错误 CREATE TABLE Test ERROR syntax error at or near SQL状态 42601 在 Pos
  • 模板继承的 UML 图

    在我的库的文件中 我有一个继承自模板的类 我的代码示例 class data class dataA public data class dataB public data inheritance from a template templ