数组中的不同类型,从数组中取出它们时如何知道将它们转换为什么?

2024-06-03

假设有一个通用的List类型的Packet,持有自定义类扩展Packet, 例如登录包 or 聊天包.

假设我把这些放在一个列表中。当我把它们拿出来时,最“具体”的类型是Packet。我想将它们转换成更具体的类型,回到原来的类型登录包 or 聊天包或者回到他们原来的类型。

问题:我该怎么做?

参考:如何在运行时以编程方式转换对象? https://stackoverflow.com/questions/1829605/how-to-cast-an-object-programmatically-at-runtime

那么...似乎如果这些自定义类共享一个通用接口,就可以解决转换问题吗?但如果是这样,我的类就不能共享一个接口。我需要在接口上构建接口,在类上构建类。那么...我该怎么做呢?抱歉,如果这个问题不太准确。不知道如何阐明我的确切问题。


You could有一长串 if/else 或 switch

if (item is ChatPacket)
{
    // cast
}
else if (...)
{
    // cast
}
else ...

然而,这可能会变得难以处理。

您可能希望重新审视您的课程设计。通过拥有List<Packet>,你有效地陈述了你不关心派生子项之间的差异,至少就其独特的 API 而言。

换句话说,如果你的设计是

class Packet { public void Foo() { } }
class ChatPacket : Packet { public void Bar() { } }

你是说你只关心能够访问Foo().

If you do关心差异,也许您可​​以通过子级的基本行为和重写行为中的抽象或虚拟方法来用多态性来表达这些差异。因此,您仍然拥有基类的集合,但您仍然可以获得每个子类指定的自定义行为。

class Packet { public virtual void Foo() { } }
class ChatPacket : Packet { public override void Foo() { } }

在这里,你打电话就打电话Foo()。无需铸造。

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

数组中的不同类型,从数组中取出它们时如何知道将它们转换为什么? 的相关文章

  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 多态性中基类缺少虚拟析构函数 = 资源泄漏?

    我们知道 如果要多态地使用基类 则需要将基类的析构函数指定为 virtual 否则程序中可能会出现资源泄漏 因为只会调用基类析构函数 而不会调用派生对象析构函数 我们还知道构造函数 析构函数纯粹是初始化 未初始化构造 而operator n
  • 如何处理作为参数传递到方法中的 Lambda 表达式 - C# .NET 3.5

    我对 Lambda 表达式的了解有点不稳定 虽然我可以编写使用 Lambda 表达式 又名 LINQ 的代码 但我正在尝试编写自己的方法 该方法采用一些 Lambda 表达式类型的参数 背景 我正在尝试编写一个方法 该方法从任何其他对象类型
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • 嘲笑会员用户

    我目前正在开发一个 asp net mvc 2 应用程序 它使用默认的 SqlMembershipProvider 进行身份验证 我已经实现了一个控制器方法 通过调用读取当前用户的 ProviderUserKeyMembership Get
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 除法时的小数舍入误差 (C#)

    我基本上有四个数字 比如 100 200 300 400 我需要计算概率为 100 100 200 300 400 200 100 200 300 400 等等在 当我使用小数数据类型来存储这些概率时 由于舍入问题 它们不会达到 1 在不使
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • 如何从另一个线程阻止 UI 线程或强制表单在 UI 线程内运行

    我的应用程序的一个要求是 如果它失去数据库连接 那么它必须弹出一个大模式 无连接 稍后重试 对话框 阻止所有用户交互 直到重新获得连接为止 我通过在应用程序启动时启动 DeviceMonitor 类的实例来实现此目的 该类创建一个 Syst
  • 将 R 值传递给采用 L 值的函数时出现过载歧义

    我有 2 个重载函数 一个采用 L 值 另一个采用 R 值 目的是让该函数可以像这样调用 Obj obj foo obj OR foo Obj 所以 我写了2个重载函数 template
  • 如何进行平衡组捕获?

    假设我有这个文本输入 tes tR R abc aD mnoR xyz 我想提取 ff 输出 R abc R xyz D mnoR xyz R R abc aD mnoR xyz 目前 我只能使用平衡组方法提取组内的内容 如中所示msdn
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert
  • 具有可导出私钥的证书的“错误密钥”例外

    我正在尝试使用非对称加密来加密然后解密文件 我已经使用 makecert 创建了一个测试证书并将其安装到我的个人本地计算机存储中 将来我必须在多个服务器上安装此证书 这就是为什么我使用 pe 标志创建它 即使用可导出的私钥 证书已成功创建并
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I
  • 有关 Endian 性和 .Net 的详细信息?

    我有几个关于字节顺序的问题 这些问题足够相关 我保证将它们作为一个问题提出 1 字节顺序是由 Net还是由硬件决定的 2 如果是由硬件决定的 我怎样才能在C 中找出硬件的字节序 3 字节序是否影响二进制交互 例如 OR AND OR 或移位

随机推荐

  • 在一个屏幕上合并 2 个图像输出(HDMI、DVI、VGA 或其他)

    我正在寻找一些不常见的东西 一种设备 可将来自 2 个输出 HDMI DVI VGA 或任何其他类型的图像输出 的图像合并为屏幕上显示的最终图像 输出可以是相同类型 例如 2 个 HDMI 或不同类型 任何有效的都可以 如果不清楚 这里有一
  • Django - 将 js 变量传递给 django 视图

    我的问题与 Google 地图 JavaScript API 有关 更具体的是自动完成功能 我已将自动完成功能作为搜索栏添加到我的测试站点 效果很好 但现在我想将所选参数传递给 Django 视图 我被困在这里了 这就是我的模板中的内容
  • 禁用 CSS 规则

    有什么办法可以禁用 CSS 规则吗 我问是因为我使用的是 Kendo UI 他们的规则非常全面 例如 k grid td styles 然而 如果我把我的桌子放在他们的桌子里面 它的风格也会类似 所以它的影响太大 需要删除 更换 我不想手动
  • d3js 折线图——如何将最后一步延伸到范围末尾?

    很简单 但我无法摆脱这个问题 线是两点 值 之间的链接 从值 A 绘制到值 B 因此 假设 A 的值为 10 B 的值为 20 而 C 缺失 现在从 0 到 10 到 20 的线已经绘制完毕 我想画从 0 到 10 到 20 到 25 的线
  • Rails:如何重新启动 sidekiq?

    我正在使用 sidekiq gem 在后台运行 API 调用 我在守护进程中运行 sidekiq 如下所示 bundle exec sidekiq d 现在我对我的方法做了一些更改 所以我想重新启动 sidekiq 我尝试使用以下命令杀死
  • 如何将 jquery 应用于具有相同 id 属性的所有元素?

    如何将 jquery 应用于具有相同 id 属性的所有元素 我想申请focus and blur 函数在一个textarea具有相同 id 的元素 正确的答案是 id yourID doSomething 对于任何代码 例如
  • 使用两个经度/纬度点获取方向(指南针)

    我正在为移动设备开发 指南针 我有以下几点 point 1 current location Latitude 47 2246 Longitude 8 8257 point 2 target location Latitude 50 924
  • 如何使用 Magento 测试 cron?

    首先我需要了解 Magento cron 是如何工作的 我知道 cron 在 Linux 上如何工作 使用crontab e 我知道我需要设置 Magento 的 cron php 定期运行 但是当我在 magento 配置文件中定义 cr
  • PDFcropbox中的坐标指的是什么尺寸?

    例如 如果一个 pdf 指定了错误的页面大小 则可以使用以下命令裁剪掉文档中不需要的部分 鬼脚本 questions tagged ghostscript和命令参数 CropBox 我的问题是 命令中的数字指的是什么 我知道它们是点单位 一
  • 更改图库中的边框样式

    我正在服用this http www androidpeople com android gallery imageview example 教程 正如你所看到的this http www androidpeople com wp cont
  • 非单射封闭型族

    我确实有一段人为设计的代码 LANGUAGE DataKinds TypeFamilies data Foo Foo type family Id n Foo a where Id Foo a a data Bar n Foo Bar cl
  • 具有多个输入的单元测试

    我一直在尝试进行单元测试 并且正在尝试处理一个函数的单元测试 该函数的返回值取决于一堆参数 不过信息量有点大 有点让人不知所措 考虑以下 我有课Article 其中有价格集合 它有一个方法GetCurrentPrice它根据一些规则确定当前
  • PHP中的“@/path/to/a/file”是什么意思?

    我偶然发现以下代码示例 image file path code tmhOAuth gt request POST https upload twitter com 1 statuses update with media json arr
  • Ajax.BeginForm 帮助程序未将部分视图加载到指定的 DIV 中

    我正在使用 MVC 尝试将表单提交的结果加载到特定的 DIV 中 下面是我的表单的代码 div class segmentForm clearfix div
  • Flask 登录 @login_required 不起作用

    我使用 Flask login 来确保用户在访问某些页面之前已登录 我在用着 login required在我想要保护的视图上 但即使我正在设置login user user 在我想要设置用户的地方 它不允许我进入受保护的路线 索引 我正在
  • 在php word中将两个徽标对齐在同一行

    我使用 php word 添加了两个徽标 但两个徽标不在同一行 我希望两个徽标位于同一行 如下所示 我的错误在哪里 if file exists logo table gt addRow table gt addCell 20000 arr
  • 防止基于时间的复制保护规避? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一些试用软件希望分发给客户 我希望试用版软件在安装 30 天后停止工作 在软件中简单检查系统日期是实现此目的的最直接方法 但是客户
  • 将参数从 AWS lambda 传递到 AWS CodePipeline

    我有一个 lambda 通过 AWS SDK 启动 CodePipeline 执行startPipelineExecution功能 是否有任何机制可将参数传递给 CodePipeline 构建 以便它可以使用 CodeBuild 构建中的值
  • 如何修改实时 Alexa 技能?

    我需要修改我已发布的 Alexa 技能 我熟悉亚马逊在发布技能后自动创建的 开发中 技能版本 我不明白的是如何迭代我的技能 特别是当我需要同时更改交互模型和链接的 Lambda 函数时 例如 我可以创建一个单独的 开发中 Lambda 函数
  • 数组中的不同类型,从数组中取出它们时如何知道将它们转换为什么?

    假设有一个通用的List类型的Packet 持有自定义类扩展Packet 例如登录包 or 聊天包 假设我把这些放在一个列表中 当我把它们拿出来时 最 具体 的类型是Packet 我想将它们转换成更具体的类型 回到原来的类型登录包 or 聊