当我们重写一个方法时,我们应该使用方法签名中的所有参数吗?

2023-12-02

我发现一些覆盖方法不使用该方法签名中的所有参数。

ex:

@Override
protected void setSomething(Object a, Object b, Object c) {
    this.a = a
    this.b = b;
    // the parameter c is not used (ignored)
}

通常父类不应该关心子类如何实现抽象方法。

但是在MHO中,方法的参数是要使用的,子类实现不需要参数的情况很少见,当这种情况发生时,很可能是接口或抽象类的设计有问题。

一个功能的基础是:输入 -> 输入过程 -> 输出。

有时您需要计算这些输入,但如果您不在函数过程中使用其中一些输入,则这些输入不应作为函数的输入放置。

您可以跳过这些输入的计算,调用使用所有输入的准确函数,因此准确的函数。

这种情况唯一可以接受的情况是当我们不想要父类的行为时,所以我们可以这样写:

@Override
protected void setSomething(Object a, Object b, Object c) {
      //Nothing to do
}

Or

@Override
 protected void setSomething(Object a, Object b, Object c) {
  throw new UnsupportedOperationException(...);
}

声纳 说:

未使用的参数会产生误导。无论传递给这样的值是什么 参数是相同的,行为将是相同的。

我的问题是: 当我们重写一个方法时,我们应该使用方法签名中的所有参数吗?

当我说“使用所有参数”时,我试图说方法签名中的所有参数实际上都在方法主体(实现)中使用。


当我们重写一个方法时,我们应该使用该方法签名中的所有参数吗?

当你重写一个方法时,被重写的方法must定义与超级方法相同的参数。

你没有义务use实现中的所有参数 - 这取决于您想要通过此实现实现的目标,有时可能不需要所有参数。

然而,在方法实现中具有未使用的方法参数是设计不佳的标志。定义方法时(abstract或已实施),您应该尝试回答以下问题“为什么我需要这个参数?” and “这个参数会一直使用吗?”。如果可能存在某些参数在实现中不会使用的情况,那么您可以定义一些超载方法。

以这个例子为例。我们来看看这个方法

void someMethod(String first, String optionalParameter) { ... }

第二个参数是可选的(即可能需要也可能不需要) - 你可以通过null或不需要参数时的任何内容。在这种情况下,我会重载两个方法

void someMethod(String first) { ... }

void someMethod(String first, String second) { ... }

我还将确保所有参数都在相应的实现中使用。

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

当我们重写一个方法时,我们应该使用方法签名中的所有参数吗? 的相关文章

随机推荐

  • C++ 大数算术

    我正在开发一个用于大数算术的类 它现在知道如何进行加法 处理 cin 和 cout 然而 它的减法功能非常有限且基本 并且不知道如何处理负数 但这很容易解决 我的问题是 如何进行乘法运算 我将在这里详细介绍它如何处理 cin 和 cout
  • 将本地 Sourcetree 存储库恢复为 master

    我是 Sourcetree 的新手 在本地造成了混乱 与 origin master 相比 有 7 个提前提交 我想忽略并删除我在本地完成的所有操作 然后通过将本地存储库恢复到当前的 origin master 来重新开始 我该怎么做呢 R
  • DIV 汇编的错误答案

    我有我的代码的一部分 mov di 3 mov cx 16 looop xor dx dx shl bx 1 adc dx dx cmp cx 16 je cx16 it s will dec cx and jump loop push d
  • 更改 ggplot 因子颜色

    我注意到这里盒须图电话 p geom boxplot aes fill factor cyl 为箱线图填充生成明亮的红色 绿色 蓝色 同时 p geom boxplot aes fill factor vs 产生独特的浅绿色 红色 在我的数
  • 如何获取链接到耶拿资源的资源列表?

    我使用 Jena API 创建了一个模型 public static void main String args Model model ModelFactory createDefaultModel Resource alice Reso
  • iOS - 从后台自动打开应用程序

    是否可以以某种方式从后台模式重新打开应用程序 例如 如果后台应用程序正在检查服务器中的某些标志 然后触发时 它会自动转到前台吗 如果没有 我可以显示一条消息并播放声音以供用户请求重新打开应用程序吗 例如 WhatsApp 如何实现这一目标
  • C#中有指数运算符吗?

    例如 是否存在可以处理此问题的操作员 float Result Number1 Number2 Number1 2 Number2 2 Result Number1 operator Number2 过去的 运算符在其他语言中充当指数运算符
  • 如何在 Jenkins 中为工件添加时间戳

    我关注了 Jenkisfile 并且正在尝试上传带有时间戳的工件 import groovy transform Field Field def timeStamp Calendar getInstance getTime format Y
  • python 中的 SpeechRecogniton 模块太慢

    我试图对我的深度学习聊天机器人使用语音识别来获取用户的输入 实际上我的语音识别功能代码是这样的 def get audio r sr Recognizer with sr Microphone as source r pause thres
  • a = (a + b) - (b = a); C++ 与 PHP

    我环顾四周 发现了公式 a a b b a 它应该交换两个变量 或某些情况下的对象 然而我用 C 和 php 测试了它 这些给了我不同的结果 php a 10 b 20 a a b b a echo a b 这打印20 10 C int a
  • 为 jython 脚本创建可执行文件

    对于我正在使用的 python 脚本py2exe创建可执行文件 有什么办法可以创建 exe or jarjython 脚本文件 分享我是如何实现这一目标的 感谢 EnigmaCurry 提供框架 Jython wiki 中的 Jar 方法效
  • Windows 8 上的德尔福 7

    我已经在笔记本电脑上安装了 Windows 8 并尝试运行 Delphi 7 我收到 AV 错误 模块 rtl70 bpl 中地址 40005A06 处的访问冲突 读取地址 C08B0033 我已经尝试了所有我能想到的方法 甚至重新安装了
  • 如何在组合框顶部插入项目?

    您好 我正在使用 Linq to SQl 来绑定组合框控件 如何在组合框列表的顶部添加项目 var items from c in db Contacts orderby c Name ascending select c if items
  • 如何以编程方式获取所有控件的ControlTemplate?(UWP)

    虽然我知道我可以从MSDN获取所有的ControlTemplates 但这还不够方便 我尝试通过添加对 windows winmd 的引用来获取 controltemplates 然后以编程方式获取模板 就像WPF一样 但是我得到了一个异常
  • onclick 触发器第一次点击不起作用

    我很困惑为什么 onclick 函数在第一次单击时没有注册 每个具有 onclick 触发器的 div 第一次必须单击两次 function selected elmnt if elmnt style backgroundColor tra
  • Laravel迁移在现有数据库表中添加列问题

    我正在 laravel 4 2 项目中工作 现在我想在现有表用户中添加列 现在我想添加另一列 当我运行迁移命令时 我总是收到相同的消息 没有要迁移的内容 下面是我的迁移模式代码 public function up Schema table
  • 从 .Net WinForms 应用程序以编程方式刷新浏览器页面

    从 asp net 页面 通过 ClickOnce 部署 启动 Net WinForms 应用程序 在某个时刻 WinForm 应用程序需要刷新它启动的网页 我怎么能这样做呢 基于 Net 的 Windows 应用程序如何刷新已在浏览器中打
  • Django:get() 返回了多个项目——它返回了 3 个

    我收到一个错误 MultipleObjectsReturned get returned more than one items it returned 3 我想编辑和更新数据库中的现有记录 下面是我的模型 视图和 html 代码 Mode
  • Powershell DirectoryService 对象错误既未捕获也未捕获

    这是我的脚本的一部分 Trap Write Output Authentication Error trapped Try New Object System DirectoryServices DirectoryEntry strDist
  • 当我们重写一个方法时,我们应该使用方法签名中的所有参数吗?

    我发现一些覆盖方法不使用该方法签名中的所有参数 ex Override protected void setSomething Object a Object b Object c this a a this b b the paramet