如何忽略/绕过重写的方法?

2024-01-03

我对 Java 相当陌生,想知道如何完成以下任务,以及它是否被认为是不好的风格,即使它是可能的。谢谢。

Fish f;  // Fish is a superclass,
Tuna t = new Tuna();  // to which Tuna is a subclass.

f=t;  // the Fish object "f" now refers to the Tuna object "t".

// Both Fish and Tuna have an identical method (signature wise) called swim() ,
f.swim();  // and so Tuna's overridden swim() method is invoked here.

但是我现在可以使用相同的“来调用 Fish 的 Swim() 方法吗?”f.swim()“ 句法?

// I would now like Fish's swim() method to be invoked here,
// but is it bad style and/or am I missing some point about OOP?
f.swim();

Edit:

回复: 各位解答,谢谢!关于 SO 用户 Rinke 下面的回答 - 他指出“您可以将金枪鱼实例分配给金枪鱼和鱼类型变量,但它始终是金枪鱼。”

这句话的最后一部分让我的 OOD 新手大脑感到疑惑 - 为什么要允许“超级对象”引用“子对象”?这种灵活性有什么好处?允许 Fish 对象能够在指鱼或金枪鱼之间“切换”有什么好处?谢谢。

Edit 2:

下面是一些示例代码,用于说明 SO 用户 Rinke 的“编辑答案”响应的概念。

Bear b = new Bear();
Fish f = getAnyFish();
b.eat(f);

Fish getAnyFish(){
    //To toggle the returned fish type, change true to false
    if (true) return new Tuna();
    else return new Salmon();
}

最简洁的答案是不”。这里的混乱来自于运行时类型和声明类型之间的差异。您可以将金枪鱼实例分配给金枪鱼和鱼类型变量,但它始终是金枪鱼。因此,如果您对该对象调用 Swim 方法,金枪鱼将像金枪鱼一样游泳(即将调用重写的方法)。

请注意,您can通过调用 super.swim() 从子类中调用超类的 Swim 方法。

当然,如果您不重写游泳方法,那么金枪鱼只需从鱼类继承该方法即可。在这种情况下,鱼类代码将在金枪鱼实例上运行。

编辑答案:

您并不总是控制您使用的代码。也许您需要将您的金枪鱼提供给其他接受鱼的 API。

从相反的角度来看:也许你正在实现一只熊。熊吃鱼。你不想关心它是金枪鱼还是鲑鱼。所以你得到void eat(Fish f),大自然(由一段不受你控制的代码实现)为你的熊提供鱼。

留下有趣的鱼的例子:看看Collections.sort()。您可以对任何列表进行排序。是 ArrayList 还是 LinkedList 并不重要。

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

如何忽略/绕过重写的方法? 的相关文章

随机推荐

  • 如何解决 TFS 错误 TF237086“无法保存工作项...”

    我在 TFS 2010 构建中收到以下错误 无法更新工作项 59 TF237086 无法保存工作项 因为至少有一个字段包含不允许的值 工作项 59 是我创建的一项基本任务 用于在签入时与我的变更集关联 我没有对 任务 工作项进行任何自定义
  • isDisplayed 对于 Protractor 中的可见元素返回 false

    EDIT 4 突破 我开始递归地遍历父节点并返回与下面相同的值 父母之一 内在mat drawer container isDisplayed 也返回 false 所有其他都返回 true 这看起来很奇怪 查看该节点 结果发现它是网站上唯一
  • 从 Python 调用 C:传递 numpy 指针列表

    我有数量可变的 numpy 数组 我想将其传递给 C 函数 我设法传递了每个单独的数组 使用
  • 如何在 SQL Server 中创建和查询链接数据库服务器?

    我需要跨两个不同的数据库服务器 IP 10 0 0 50 和 10 0 0 51 进行联接 最好的办法是什么 我找到的解决方案 1 运行存储过程 http msdn microsoft com en us library aa259589
  • 如何配置 CLion 标准控制台输出?

    Problem CLion 不会出于调试目的输出任何控制台输出 我将 CLion 与 MingW 编译器和 cmake 一起使用 无论我是否使用 std cout lt lt Testing lt lt std endl Or printf
  • 即使光标不受控制,也能接收鼠标移动

    我做了类似滚动条的事情Control 一切都很好 但是当光标离开控制区域时 OnMouseMove不再收到 当您使用标准 Windows 滚动条时 即使鼠标光标位于控件表面之外 也可以使用它 为了避免这种情况 我唯一的想法是从屏幕获取光标位
  • 有没有办法将设计器文件与其 cs 文件重新绑定/关联?

    我在 Xamarin 中有一个项目 并且我的 designer cs 文件不再嵌套在其 cs 文件下 这会导致编译错误 有没有办法再次关联它们以便我可以编译我的项目 请参见下图 ListHeader 与 ListTableView 编辑您的
  • 在 firebase 数据库中搜索具有特定键值的元素对象

    我正在尝试在 firebase 数据库中使用 userkey 的特定值进行搜索 但我遇到了以下问题 我想获取 如果我传递用户密钥 11112 那么当我传递 11113 时 就会出现两条记录 然后就会出现一条记录 尽管我尝试使用下面的代码但出
  • 如何在Rails应用程序中使用sendgrid发送电子邮件的响应以保存在数据库中

    我已经使用sendgrid和actionmailer通过rails应用程序发送了电子邮件 我也收到了邮件 但我希望在我的 Rails 应用程序中显示 sendgrid 发送的电子邮件的状态 打开 发送 退回 以便我可以将特定电子邮件的响应保
  • Sql JOIN顺序会影响性能吗?

    当我遇到这个查询时 我正在整理一些sql SELECT jm IMEI jm MaxSpeedKM jm MaxAccel jm MaxDeccel jm JourneyMaxLeft jm JourneyMaxRight jm Dista
  • 使用 NEST 进行多字段的正确方法

    我想用 NEST 实现全文搜索和标记化搜索 所以我想获得这样的多字段 tweet properties message type string store true fields raw type string index not anal
  • 使用 jQuery 从 asp:RadioButtonList 读取所选值

    我有类似于以下的代码 p p
  • 如何判断H2数据库文件锁是否存在?

    由于我不会解释的原因 因为人们会将他们的反应指向另一个主题 而不是我手头的问题 我需要知道如何确定我的 H2 数据库是否被锁定 使用 Java 代码 如何确定数据库中是否存在锁定文件 对于阅读这个问题的其他人 我需要解释一下为什么你不应该自
  • 导入错误:没有名为“setuptools.build_meta”的模块

    我在解决这个问题时遇到了麻烦 当尝试安装软件包 在本例中为 zipline 时 很难找到 setuptools build meta 文件 而我确实在 site packages setuptools 目录中拥有该文件 尽管我很无知 但我尝
  • 如何找到UILabel的行数

    我使用换行方法在 UILabel 中显示文本 现在我想知道 UILabel 中有多少行 如果有任何可能的方法可以找到 UILabel 的行数 Thanks 正如所指出的 这篇文章涉及如何获取高度 而不是行数 要获取行数 获取单个字母的高度
  • 中断 Simpy 中较早的超时事件

    我想创建一个带有服务器的系统 在准备好提供服务之前需要时间进行设置 每当有顾客到达队列时 就会建立一个服务器 先到的顾客将抢占先打开的服务器 如下所示 客户 1 到达并请求服务器 服务器 1 在 t1 秒内完成设置 客户 2 到达并请求服务
  • Wordpress 插件激活标头已发送错误

    我快要疯了 错误 插件在执行期间生成了 4 个意外输出字符 激活 如果您注意到 标头已发送 消息 则存在问题 对于联合供稿或其他问题 请尝试停用或删除 这个插件 删除不必要的空白或换行符 这将消除错误 也删除最后一个 gt 尝试下面的代码
  • 从 QTableView 自定义委托中选择组合框的项目

    我使用自定义委托在 QTableView 中显示一列组合框 所有组合框的值都是相同的 因此给我带来麻烦的并不是人口部分 我希望它们显示为所选项目 即我可以从数据库检索的一些值 我可以从委托访问数据库 但为了发送我的请求 我需要组合框的行 所
  • C++ 中使用标签进行静态结构初始化

    我已经在 stackoverflow 中搜索了答案 但找不到相关的内容 我试图通过指定其标签来使用初始值初始化静态结构实例 但在编译时出现错误 src version cpp 10 error expected primary expres
  • 如何忽略/绕过重写的方法?

    我对 Java 相当陌生 想知道如何完成以下任务 以及它是否被认为是不好的风格 即使它是可能的 谢谢 Fish f Fish is a superclass Tuna t new Tuna to which Tuna is a subcla