问题标签 [downcast]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2117 浏览

c++ - 从基指针向下转换为模板派生类型

我有以下层次结构:

现在给定一个指向 base 的指针,我想知道底层是derived1 还是derived2。问题是 derived1 和 derived2 都可以专门用于许多不同的类型,使用 dynamic_cast 来测试向下转换需要知道模板类型。我最终得到了一些混乱、不可维护和不完整的代码:

有没有更好的方法,可以处理任何类型的专业化?

0 投票
1 回答
172 浏览

c# - 对 POCO 课程感到失望

我有一组 POCO 课程:

我有一个返回 ReportBase 的 web 方法。调用者使用返回值根据实际类型通过向下转换和检查类型(一个网格用于销售,一个网格用于购买)来更新 UI(WPF)。有人建议使用三个 web 方法,每个方法都返回特定的类型。

我知道通过引入 if/else,downcast 通常是违反设计原则的。相反,我们应该使用虚函数。但是在 POCO 类中,我们并没有真正的虚拟行为(只有额外的字段)。

在这种情况下,你是支持还是反对沮丧,为什么?

0 投票
3 回答
1130 浏览

c++ - 通过队列传递信息时如何避免向下转换?

我正在编写一个工具,它使用户能够通过更改设置然后流式传输信息来与一些硬件进行交互。

为此,我运行了几个线程:EquipmentInterface它们DataProcessor通过Queue.

EquipmentInterface线程具有更改设备设置的方法(例如),并将结果信息(和Rotate)添加到. 一旦设置正确,就会有方法,一旦开始流式传输,来自设备的数据就会被打包并添加到队列中。RefocusCurrentAngleCurrentFocalDistanceQueueStartStreamingStopStreaming

放置在队列上的所有信息都来自一个BaseMessage包含消息类型指示的类。然后,我导出了角度、焦距、开始和结束流媒体的消息类型,当然还有数据本身。

监听队列的DataProcessor另一端并根据当前角度/焦距处理后续数据。

现在,问题是,我在数据处理器中有一个函数,它使用 switch 语句对传入的消息进行类型检查。然后将这些消息向下转换为适当的类型并传递给适当的处理程序。实际上,不只是一个 DataProcessor 监听一个队列,而是多个队列上的多个监听器(一些存储到磁盘,一些在 gui 上显示信息)。每次我添加一些信息时,我都必须创建一个新的BaseMessage派生类,向该基类添加一个新类型,然后更新每个消费者中的 switch 语句以处理新消息。

这种架构的某些东西让我觉得不对劲,最近我读了很多关于向下转换的文章。从我所见,普遍的共识似乎是我正在做的是一种糟糕的代码气味。我看到了一个使用 Boost 的建议,但它们看起来并不比我的 switch 语句更干净(也许我遗漏了一些东西?)。

所以我的问题是:我是否应该尝试避免使用 switch-statement / downcasting 解决方案,如果是,如何?

我的实现是在 C++/CLI 中,所以 .net 或 C++ 解决方案都是我所追求的。

编辑- 根据 iammilind 和 stfaanv 的评论,您是否建议这样做:

...可以简化吗?感觉有点笨拙,ProcessMessages但这是我能看到的唯一方法,没有 switch 语句和基类中的某种枚举消息类型标识符。

0 投票
5 回答
1279 浏览

java - 向下转换会产生 ClassCastException。我怎样才能解决这个问题?

我正在尝试实现一个私人消息系统。让我知道这是否是糟糕的设计,但我有两个类UserRecipient. Recipient是一个User所以它继承UserRecipient具有附加属性,例如messageId, readDate, keepMessage.

我的代码如下:

.

0 投票
5 回答
10313 浏览

c# - 在 C# 中将基实例转换为派生类(向下转换)

假设我有两个类:

我知道这样的事情是行不通的,因为我不能对 C# 失望:

我的问题是:如何以有效的方式完成沮丧?实际上,我在 AdvancedEmployee 上有一个构造函数,它以 Employee 作为参数并使用它来注入其值,基本上是进行克隆。


更新

为了解决会被重复的数据,我稍微改变了方法,现在 AdvancedEmployee 包含一个员工,而不是一个员工本身。例子:

0 投票
1 回答
2891 浏览

c++ - dynamic_cast 和多态的最佳实践

我有一个设计问题,我不确定如何以最佳方式处理。我希望我的代码是面向未来的,并且仍然不会变得混乱和复杂(极客的困境)。

目前我的设计有以下设置

classB与class 不同A,classD与 classE不同,classB与classC不同A

由于这些类不同,我需要使用dynamic_cast运算符。

正如你所看到的,我会想要使用dynamic_cast很多!我需要尝试找到一种很好的方法来做到这一点,而不是if()额外的陈述。

有没有一种巧妙的方法来做到这一点?我似乎记得在 Scott Meyers 的书中看到过一些东西,但我离家一两个星期都无法访问它。

任何参考/示例将不胜感激。

另外,如果需要,我可以将类B变成一个接口,这将是一种解决方案

但并不理想。

注意:我添加了这个例子来显示我当前的设计失败

getObjectType1()由于静态类型 A不dynamic_cast知道此功能,因此无法访问。我需要重新考虑我的设计。有任何想法吗?

0 投票
2 回答
3831 浏览

c++ - 如何避免沮丧?

我有一个状态模式的实现,其中每个状态都处理它从事件队列中获取的事件。因此基State类有一个纯虚方法void handleEvent(const Event*)。事件继承基Event类,但每个事件都包含其可以是不同类型的数据(例如,int、string...或其他)。handleEvent必须确定接收到的事件的运行时类型,然后执行向下转换以提取事件数据。事件是动态创建并存储在队列中的(因此在这里进行向上转换......)

我知道向下转换是糟糕设计的标志,但在这种情况下是否可以避免它?我正在考虑访问者模式,其中基类 State 将包含每个事件的虚拟处理程序,但是再次向下转换将需要发生在从队列中取出事件并将其传递到当前状态的代码段中。(至少在这种情况下,大switch(eventID)只会在一个地方......)。访客模式是避免向下转换的最佳方式(最佳实践)吗?

这是伪代码(我boost::shared_ptr在这个例子中传递,但无论如何都会发生向下转换):

0 投票
5 回答
751 浏览

java - 如何将 List 从子类泛型转换为父类泛型?

我正在修改开放的 JDK 以添加功能,但我已经遇到了两次没有好的解决方案。

有一个名为JCStatementextends的类JCTree

问题:我想将 aList<JCStatement>转换为List<JCTree>.

很明显,一个类可以引用它的一个扩展,但是当我将它放在 List 上时,它就不起作用了。

我使用:(List<JCTree>)((List<?>)params)进行投射,它可以工作,但不能建立在 ant 上。IDE 给我以下警告:

所以这必须以某种方式解决。

我很感激任何帮助。

0 投票
1 回答
390 浏览

java - Java:当你知道超类时反对强制转换

我不知道如何定义我的疑问,所以如果问题已经被问到,请耐心等待。

假设我必须动态实例化一个对象。这个对象肯定是一个已知的、不可变的类A的子类的实例。我可以动态获取具体的实现类。

完全像我对目标类一无所知一样使用反射会更好,还是最好/可以做类似的事情:

在哪里Sub-A extends A?目的是避免反射开销时间......

0 投票
1 回答
147 浏览

python - Python (django) 通用模块开发 - 在数据库中存储动态查询集?模型继承

我有一个有趣的设计决定要在我计划最终发布的 Python Django 模型的上下文中做出。

这些类对 ApprovalRequest 进行建模,它表示用户提出的问题/请求,可以由另一个用户组投票,也可以上诉,然后可以由“更高级别”组再次投票,等等。

我有什么相当于以下模型树:

  • ApprovalRequest(单个请求)
    • 用户请求操作
    • 行动类型* / 附加数据
  • ApprovalStage(可能是多个投票阶段,按时间顺序排列)
    • 相关的批准请求
    • 投票类型(简单多数,需要一票等)
    • 可以投票的用户*
  • ApprovalVote(单票,由单个选民投票)
    • 相关审批阶段

我的第一个问题与“动作类型”有关。因为我的意图是让它成为一个任何人都可以使用的可重用模块,所以我希望它在事件发生时发出信号。但是,此模型适用于许多事情 - 审核、用户提升、用户禁令上诉决定等。因此,需要某种“类型”参数。在 OOP 设计中解决此问题的经典方法是允许创建子类并具有自定义操作,这很好,但 Django(特别是)没有简单的方法从数据库中获取“正确”子类。例如,使用内置模型继承,将有一个主 ApprovalRequest db 表和 N 个附加 db 表,用于每个孩子的数据。

我最初的想法是创建一个子类“registry”,它会为我的类型字段分配一个唯一的 id,这样当我需要采取特定类型的操作时,我可以可靠地向下转换为注册类型。这将迫使子类为其子类选择一个(项目范围的)id,并且通常看起来不优雅。

我的第二个问题与“可以投票的用户”有关。我希望这些 ApprovalRequest 对象中的大多数实际上是由代码创建的,而不是通过例如 Django 管理员。假设发生以下动作:

  1. 用户请求促销(或其他操作)
  2. 创建 ApprovalRequest 对象,指定匹配某个代码相关组(即复杂查询集)的所有用户都可以投票
  3. 时间过去了,没有对 ApprovalRequest 采取任何行动
  4. 十个新用户现在满足复杂查询集的条件(也就是说,如果现在创建 ApprovalRequest,这些用户也将成为投票组的一部分)
  5. 我希望这些新用户能够投票

问题或多或少是,我如何以安全的方式存储这个复杂的查询集?我可以根据类型将这项工作委托给子类,但这似乎不优雅。我可以尝试以某种方式将查询集存储在数据库中,但这似乎有点 hacky。选择的标准路线是什么?

感谢您对这些问题的任何建议。