试图根据具体情况抑制覆盖是错误的吗? [关闭]

2024-02-26

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

Car 类描述了汽车的行为。 FlyingCar 类描述了可以变形和飞行的汽车的行为。

我从某处收到 Car 类或其子类的对象。我无法控制他们传递给我的东西。

我知道由于我的图形引擎的技术限制,我无法显示飞行汽车。或者也许我希望玩家在不使用飞行能力的情况下完成特定任务。因此,我想简单地禁用汽车的飞行能力,使其看起来像是 Car 类的对象。我在想使用向下转型 https://stackoverflow.com/questions/8886159/can-overriding-of-a-method-be-prevented-by-downcasting-to-a-superclass,但似乎行不通。

这也许是不可能的,但如果我找到一种方法用我使用的语言来做到这一点,这是不是糟糕的设计?如果是这样,为什么,还有什么替代方案?

我无法使用复制构造函数之类的东西从我收到的类创建 Car 类的对象,因为所有数据的复制成本太高(Car 对象很大)。

Thanks!

EDIT:

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

我想了解这是否是一个糟糕的设计,其原因与某种语言(无法)支持它的能力无关。


我的意见通常是否定的。

原因是,即使你能以某种方式让你的 FlyingCar 的行为就像从现在开始它是一辆汽车一样,它仍然已经已进行手术就好像它是一辆 FlyingCar,并且可能不再处于汽车的有效状态。

也许您的图形引擎无法显示 FlyingCar 的原因是它使用的纹理。但已经有人叫了load_appropriate_textures方法,它已将纹理数据存储在其中。如果你打电话,将 FlyingCar 变成汽车将会改变发生的事情load_appropriate_textures再次,但 FlyingCar 不会覆盖render_car方法,它只是将数据放在哪里render_car会找到它。因此,您组织中的其他一些糟糕的程序员最终只会尝试调试汽车无法渲染的原因,并显示一些有关 FlyingCar 纹理的错误消息。

也许在这一特殊情况下不会发生这种情况。但它可以。有人可以稍后以引入此类问题的方式修改 Car 和 FlyingCar。

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

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

确实,听起来 FlyingCar 需要具有禁用其飞行功能的功能。这样的事情事后总是很难再坚持下去。

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

试图根据具体情况抑制覆盖是错误的吗? [关闭] 的相关文章

  • 如何调用进行 API 调用的类的实例以及该类中发出请求的函数,并将其分配给变量?迅速

    这是以下问题的后续 为什么代码不在第二个 URLSession shared dataTask 之后 之内执行 即在初始 URLSession shared dataTask 的 do 块内 迅速 https stackoverflow c
  • 重写方法时,我的自定义代码应该位于 super(base) 之前还是之后

    重写方法时 我的自定义代码应该在对父类的超级 基 调用之前还是之后 这里有 3 个选择 如果你想执行代码之前的基本行为 然后之前调用它 如果你想执行代码后的基本行为 然后调用它 如果你想完全覆盖基本行为 根本不调用它 重要的是还检查您的 A
  • 从另一个类添加 Swing 组件

    我正在学习java 我正在尝试从另一个类向我的框架添加一个菜单栏 练习将代码划分为多个类以更好地组织程序 这是我的代码示例 public class MainApp public static void main String args C
  • 要实现 XML 可序列化,从 ICollection 继承的类型必须具有 Add 的实现

    我有来自现有项目的 CSLA 1 x 框架 对象 我试图在新的 Net 4 0 项目中使用它 这些对象正在生产中使用 如果没有 2 组对象 我确实无法将它们转换为 2 x 或 EF 在我的 c webservice 中 当我尝试运行它时 我
  • CSS - 让div继承高度

    我正在尝试制作一个带有圆角的盒子 其中 div 的高度和宽度取决于内容 因此它会自动调整 您可以在此处查看示例 http pastehtml com view 1duizyf html http pastehtml com view 1du
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • 如何在 Eclipse 中获得完全限定的类名?

    有没有一种快速方法可以在 Eclipse 中单击 Java 类并获取其完全限定名称 或将其复制到剪贴板 2016年6月29日编辑 正如 Jeff 所指出的 您只需要执行以下第二步 1 Double click on the class na
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 在打字稿中获取类的键

    我有一个包含很多方法的类 我们称之为 myClass 我这样称呼它 myClass key 有没有办法从 key 获取可能的值 我希望有类似 keyof myClass 的东西 但我得到 myClass 引用一个值 但在这里被用作类型 问题
  • RESTful API:我应该在哪里编码我的工作流程?

    我正在开发一个 RESTful API 这是我的第一个 API 也是我的第一个真正大型的编码项目 因此 我仍在学习很多关于建筑等方面的知识 目前 我的 api 设置分为以下几层 HTTP层 资源层 领域模型 业务逻辑层 数据访问 存储层 持
  • Django 模型:如何使用 mixin 类来覆盖 django 模型以实现 save 等功能

    我想在每次保存模型之前验证值 所以 我必须重写保存函数 代码几乎是一样的 我想把它写在 mixin 类中 但失败了 我不知道如何写 super func 我英语不好 抱歉 class SyncableMixin object def sav
  • VBA全局类变量

    我的障碍是试图让多个子程序识别类变量 当我尝试全局声明它们时 出现编译错误 无效的外部过程 然后 当我运行公共函数或子函数来声明变量时 它们在其他子函数中保持未定义状态 我希望多个子程序能够识别变量 因为它们的值应该通过用户窗体进行更改 然
  • 使用继承编写 __repr__ 函数的正确方法

    我正在尝试 OOP python 但我不确定 repr 函数继承 由于父类函数如下所示 def repr self Returns representation of the object return r format Class nam
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • Django 模板 - 我可以设置要在父模板中使用的变量吗?

    我有一个包含通用导航菜单的父模板 我希望能够添加class selected 到适当的菜单选项 我希望能够在子模板中设置变量 例如 set menu products and do ifequal menu products class s
  • C++ 是否要求从派生类初始化基类成员?

    class Base public int a Base a 0 virtual Base class Derived public Base public int b Derived b 0 Base pBase static cast
  • Python - 如何实现“可停止”线程?

    已经发布解决方案了here https stackoverflow com questions 323972 is there any way to kill a thread in python创建一个可停止的线程 但是 我在理解如何实施
  • 这是 isinstance pythonic/“good” 的用法吗?

    的副作用是this https stackoverflow com questions 3110624 why typeclassinstance is returning instance 3110654 3110654问题是我被引导到这
  • Java加减法与金钱

    我正在尝试对美元和美分进行加法和减法 但在超过 100 美分和低于 0 美分时遇到困难 我的代码可以很好地添加任何内容 直到我需要将 100 美分转换为 1 美元 我无法将我的话转化为代码 但我知道需要做什么才能将美分转换成美元 仅供参考
  • 将项目导入 Eclipse 后出现“必须重写超类方法”错误

    任何时候我必须将我的项目重新导入到 Eclipse 中 如果我重新安装了 Eclipse 或者更改了项目的位置 几乎全部我的重写方法的格式不正确 导致错误 该方法必须重写超类方法 值得注意的是 无论出于何种原因 Android 项目中方法参

随机推荐

  • Stackable Traits Pattern:方法的实现“需要‘抽象覆盖’修饰符”

    最近 我发现了可堆叠特征模式并遵循了所描述的示例here http www artima com scalazine articles stackable trait pattern html 一切正常 但有一种情况我无法理解 trait
  • 如何使用 Rails 5.1.0 和 jQuery

    我开始使用 Rails v5 1 0 据我所知 它默认没有 jQuery 但是想要安装 jQuery 来与 Zurb Foundation 6 一起使用 由于基础当前未加载模态 设置此功能的最佳方法是什么 Summary 安装纱线 yarn
  • Python,文件(1) - 为什么使用数字 [7,8,9,10,12,13,27] 和范围(0x20,0x100)来确定文本与二进制文件

    关于一个python中判断文件是二进制还是文本的解决方案 https stackoverflow com a 7392391 回答者使用 textchars bytearray 7 8 9 10 12 13 27 bytearray ran
  • mysql_real_escape_string 如何工作

    mysql real escape string 如何工作 是删除mysql函数还是在mysql函数之间添加 它比addslashes更好吗 mysql real escape string 调用 MySQL 的库函数 mysql real
  • +[NSString stringWithString:] -- 有什么意义?

    As NSString字符串是不可变的 它的值是多少stringWithString 类方法 与使用时我得到了实用程序NSMutableString 我只是没有看到实用程序NSString class 您可能有一个想要复制的 NSMutab
  • 修改 pandas 中的时间戳以使索引唯一

    我正在处理不定期记录的财务数据 有些时间戳是重复的 这使得分析变得棘手 这是数据示例 请注意有四个2016 08 23 00 00 17 664193时间戳 In 167 ts Out 168 last last sz bid ask da
  • Android Studio无法登录GitHub

    我在 Android Studio 上登录 GitHub 时遇到此问题 无法登录 无法获取用户信息 404 未找到 有人遇到过这个问题吗 我该如何解决这个问题 我也遇到过这个问题 尝试使用令牌登录 在浏览器上登录github com 转到设
  • vb6 调用形式,名称包含在数组中

    我有一个名为菜单的数组 它包含每个元素的表单名称 我怎样才能动态地调用它们 例如 如果菜单 1 登录 and 菜单 2 注销 我需要说 Login Show 但我想使用数组名称来执行此操作 我显然不能这样做 Menus X Show 这在V
  • 找不到语言 json 的内核 - 原子上的氢

    我发现有些人抱怨python kernel但这不是我的问题 这是错误的打印屏幕 https i stack imgur com DGvfC png 您可以在其中看到当我尝试运行 ipynb 文件时 它给我一个错误json kernel 该包
  • android EMFILE(打开文件太多)

    我实现了一个文件缓存来加载小图像以实现长网格视图 滚动一段时间后 我得到了很多libcore io ErrnoException open failed EMFILE Too many open files 我该如何避免这种情况 这是读取一
  • CodeDomProvider:LIB环境变量位于哪里?

    我正在使用一个System CodeDom Compiler CodeDomProvider CreateProvider CSharp 动态编译 C 类 最近 我从 Visual Studio 2010 切换到 Vistual Studi
  • Woot-badge 就像 PHP 中的一样

    有谁知道如何在用 PHP 编写的网站中实现某些功能 类似于堆栈溢出上的 Woot badge 和 Fanatic badge 我想奖励我的用户 如果他们连续 75 天每天访问我的网站 没有一天不访问它 我的网站使用会话进行登录 我使用 My
  • Google Maps Android API 实用程序集群管理器在创建集群之前是否有最低数量的标记?

    I am using the Google Maps Android API Utility Library to enable clustering in my app When five or more markers are co l
  • NSSpeechRecognizer 示例

    好的 所以我需要这样做 等待命令 晚安 然后运行一个动作 有人可以解释如何实现这一点吗 试试这个网站 http www cocoadev com index pl NSSpeechRecognizer http www cocoadev c
  • R 中带有 rCharts 的 nvd3 scatterPlot:增加标签的字体大小?

    我正在尝试增加使用创建的图中 x 轴和 y 轴的字体大小 NVD3 和 rCharts 这是我的情节代码 任何帮助表示赞赏 n1 lt nPlot pValues Chr data dat type scatterChart height
  • Git rebase 更改作者? [复制]

    这个问题在这里已经有答案了 所以我愚蠢地在一台未配置 git 的机器上进行了 3 次提交 没有作者或电子邮件 并且我想将这 3 次提交 尚未推送 作者更改为他们应该的内容 I know git commit amend可以换作者 但是怎么才
  • Android-按下按钮时将文本视图添加到布局

    现在我有一个文本字段 其下方有一个按钮 add 我想做到这一点 以便每次在文本字段中输入文本并按下 添加 按钮时 都会将一个新的文本视图添加到其下方的垂直布局中 并包含用户在该字段中键入的文本 我不想简单地使文本视图不可见 然后在单击时可见
  • Java 线程示例? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 谁能给出一个示例程序 以简单的方式解
  • BaseAdapter 类不会在 Asynctask 中 setAdapter - Android

    我有一个收集用户名 评论和数字的 asynctask 它将它们放入字符串中 然后调用 BaseAdapter 类 创建一个适配器 并将适配器设置为该类 但我的代码不起作用 它使应用程序崩溃 这是我的代码 public class Dashb
  • 试图根据具体情况抑制覆盖是错误的吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我明白为什么通过方法重写实现的多态性非常有用 我问的是 在某些情况下 当多态对象作为参数被接收时 而不是在定义其类时 尝试抑制它可能会出现什么问