首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >试图逐个案例地禁止重写是错误的吗?

试图逐个案例地禁止重写是错误的吗?
EN

Stack Overflow用户
提问于 2012-01-16 21:34:21
回答 4查看 88关注 0票数 0

我理解为什么通过方法覆盖实现的多态性是非常有用的。我在问,在某些情况下,当多态对象被作为参数接收时(而不是在定义它的类时),如果试图抑制它,可能会出现什么问题。

class car描述了汽车的行为。FlyingCar类描述了一辆可以变形和飞行的汽车的行为。

我从某个地方收到Car类或它的子类的对象。我无法控制他们传给我的东西。

我知道,由于我的图形引擎的技术限制,我不能显示飞行的汽车。或者我想让玩家在不使用飞行能力的情况下完成特定的任务。因此,我想简单地禁用汽车的飞行能力,让它看起来像是Car类的对象。我在想using downcasting,但它似乎行不通。

这可能是不可能的,但如果我找到了一种用我使用的语言做到这一点的方法,这是不是很糟糕的设计?如果是这样,为什么,还有其他选择吗?

我不能使用复制构造函数从我收到的对象中创建Car类的对象,因为由此产生的复制所有数据的开销太大( Car对象很大)。

谢谢!

编辑:

我想避免在这个问题中选择特定的语言。一旦我选择了一种语言,答案很可能是“这在技术上是不可能的”,或者“这是可能的,但所需的黑客攻击太危险了”,等等。

我想知道这是否是糟糕的设计,原因与某种语言支持它的能力无关。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-17 00:03:59

我的意见通常是否定的。

原因是,即使你能以某种方式使你的FlyingCar的行为只会像它是一辆汽车从这一点上,它仍然是已经在上操作,就好像它是一辆FlyingCar,并可能不再是一个有效的状态为汽车。

也许你的图形引擎不能显示FlyingCar的原因是因为它使用的纹理。但是已经有人在它上面调用了一个load_appropriate_textures方法,这个方法已经在里面存储了它的纹理数据。将FlyingCar更改为汽车会改变再次调用load_appropriate_textures时发生的情况,但FlyingCar不会覆盖render_car方法,它只是将数据放在render_car可以找到的地方。因此,您组织中的其他一些糟糕的程序员将最终尝试调试为什么汽车无法渲染,并显示一些关于FlyingCar纹理的错误消息。

也许在这个特殊的案例中不会发生这种情况。但这是可能的。有人可以在以后修改Car和FlyingCar,从而引入这种问题。

一般来说,对于FlyingCar“就好像”它是一辆汽车,你真的必须再次重复所有的初始化(和后续的修改)。重复后来的修改通常是不可能的(因为它们没有被记录下来),并且重复初始化只意味着构造一辆新车。

所以看起来“总的来说”这是个坏主意。在任何特定的情况下,如果你能找到这样做的方法,也许你会决定它是可以接受的。程序员每天都会做出妥协,这种情况时有发生。但如果不能完全通用性地做到这一点,那么你总是会冒着以后对Car和/或FlyingCar做出完全合理的更改的风险,从而使您的黑客攻击不再起作用。

真的,听起来FlyingCar需要具备禁用其飞行功能的功能。像这样的东西总是很难在事后固定下来。

票数 1
EN

Stack Overflow用户

发布于 2012-01-16 22:11:49

您可以使用composition instead of inheritance (听起来您的Car对象无论如何都需要重构为更小的类:the Car object is huge)。

然后,Car对象可以包含一个组件,该组件使其具有飞行功能。要禁用汽车的飞行能力,您只需临时(或永久,如果需要)从Car对象中移除飞行组件。

票数 0
EN

Stack Overflow用户

发布于 2012-01-17 00:29:12

通常,当我们创建一个FlyingCar时,我们会确保以一种正确工作的方式扩展Car。希望我们只依赖Car的接口,Car承诺保持不变;如果我们还依赖于Car中的其他代码,我们这样做是因为我们拥有这些代码。

另一方面,这在相反的方向上不起作用。当有人试图将FlyingCar改装成汽车时,无论用户多么小心,都不能保证它不会坏掉。毕竟,FlyingCar只是承诺,如果按原样使用,它将表现为汽车的变体;而不是说,在有人试图从它身上取出一些部件后,它将表现得像汽车一样。

例如,FlyingCar可能在构造时修改了各种控件的函数。如果它的方法被禁用了,它就不会变成汽车;它只会坏掉。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8886568

复制
相关文章
【EF】数据表全部字段更新与部分字段更新
在更新数据库的过程中,出现了” 更新条目时出错。有关详细信息,请参见内部异常。“的问题。
全栈程序员站长
2022/08/09
1.8K0
更新Mapx地图的字段
'更新地图的字段   Dim ftr As Feature   Dim rs As ADODB.Recordset   Map1.Layers("油井").KeyField = "name"   For Each ftr In Map1.Layers.Item("油井").AllFeatures     Set rs = oCn.Execute("select * from petro_well where wellname='" & ftr.KeyValue & "'")     If Not rs.EO
用户1075292
2018/01/23
1.1K0
MySQL中"更新时间"字段的更新时点问题
我们在设计表时,通常为了记录数据插入和更新的时间,会定义两个字段,create_time/insert_time和update_time,按照需求,记录插入的时间,会存储到create_time/insert_time字段中,记录更新的时间,会存储到update_time字段中,当创建记录时,会同步更新create_time/insert_time和update_time,然而,当更新记录时,只会更新update_time字段。
bisal
2022/09/29
5.2K0
update自更新字段添加新字段是否会更新旧数据
验证:一张具备自更新字段的表,如果新增一个字段,原表数据的update_time字段是否会更新?
薄刀刀
2022/04/29
1.1K0
MP字段更新策略
添加@TableField(updateStrategy = FieldStrategy.IGNORED)
阿超
2022/10/28
1K0
它来了,它来了,Power BI的5月更新带着【字段参数】向你走来了
https://powerbi.microsoft.com/en-us/blog/power-bi-may-2022-feature-summary/
陈学谦
2022/05/25
8660
它来了,它来了,Power BI的5月更新带着【字段参数】向你走来了
hibernateTemplate update 只更新被修改字段
如果你用hibernateTemplate操作数据库,感觉的确很省代码,一行代码解决数据库增改删查,但当你做到一个功能只更新一个字段,你就有点懵逼了,怎么试就是不行,总的就是下面的异常报错。
全栈程序员站长
2022/09/07
7850
突击并发编程JUC系列-原子更新字段类AtomicStampedReference
他来了,他来了,他带着 ABA 问题走来了,小伙伴们,大家好,我们又见面了,突击并发编程 JUC 系列实战原子更新数组类马上就要发车了。
山间木匠
2020/09/25
3790
突击并发编程JUC系列-原子更新字段类AtomicStampedReference
mongodb 更新删除内嵌list字段值
查询结果如下,现在需要把 “证券代码” =》 “code” ; “发行人中文名称” =》 “COMP_NAME”
周小董
2019/03/25
3.1K0
MongoDB数据插入、删除、更新、批量更新某个字段
查询出hospitalName是xx医院和openId以2开头的所有记录,并且更新my_booking表中的payType为1.
周小董
2019/03/25
26.8K0
MongoDB数据插入、删除、更新、批量更新某个字段
PostgreSQL update/delete/upsert关联更新字段数据
update ori_table_name a set col = (select col from new_table b where a.rel_col=b.rel_col);
chimchim
2023/10/17
3270
Power BI 重大更新:字段参数详解 - 基础篇
虽说是一个点,且在官方说明的篇幅非常少,但是这个特性却意义重大而深刻。我们会用不同的文章来说明这个特性的各种特点。
BI佐罗
2022/07/07
4.2K0
Power BI 重大更新:字段参数详解 - 基础篇
Spring Data JPA: 更新字段采坑记
三个注解缺一不可!!! 缺少@Modifying.报错如下!
JavaEdge
2018/08/02
2.3K0
Spring Data JPA: 更新字段采坑记
Rafy 框架 - 实体支持只更新部分变更的字段
Rafy 快一两年没有大的更新了。并不是这个框架没人维护了。相反,主要是因为自己的项目、以及公司在使用的项目,都已经比较稳定了,也没有新的功能添加。但是最近因为外面使用了 Rafy 的几个公司,找到我,提出了一些明确的需求,期望我做一些相应的升级。所以可能最近几个月,会陆续更新 Rafy 框架。
用户1172223
2021/10/15
1.2K0
mysql更新字段中的部分内容
在实践中,会出现某些字段中的内容变了,比如三方提供的图标地址变了,那么或许对字段中存储的图片域名进行更新,此时就需要用到mysql更新字段中的部分内容的功能。
程序新视界
2020/05/18
2.4K0
Golang MongoDB Driver 更新符合条件的数组元素的字段
在 MongoDB 的 Shell 里修改文档里某个符合条件的数组里的值的字段,可以这样:
饶文津
2020/08/05
4.1K0
DRF中多对多ManytoMany字段的更新和添加
drf的序列化器给模型输出带来了便利但是对于多对多字段网上查询的内容却是很少(也有可能是本人不会搜答案)
对你的承诺
2023/09/07
9790
sql server 更新两个表的某个字段
--临时表 create table tmp_cup ( a varchar(20), b varchar(50), c varchar(20) ) select * from t_customer --//更新简称字列 update t_customer set SHORTNAME=(select shortname from tmp_cup where a=custid) 不过如此的话, 如果子查询的某个查询返回多条数据的话就有可能报错:消息 512,级别 16,状态 1,
乔达摩@嘿
2020/09/11
2.1K0
mysql更新同一个表的同个字段
需求: 数据表express_log的字段option_time,将状态为30的更新为状态为0的加上2秒
用户1571008
2022/11/18
2.3K0
点击加载更多

相似问题

Sitecore字段的编程更新

25

Sitecore以编程方式更新NameValueList

12

如何使用编辑器以编程方式发布已更新的Sitecore项

31

以编程方式更新Drupal CCK字段

20

能否以编程方式更新ACF Wysiwyg字段?

22
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文