如何重构两个非常相似的方法

2023-12-28

我有以下课程:

public interface IBaseInterface {
    String baseMethod();
}

public class BaseClass implements IBaseInterface{

    @Override
    public String baseMethod() {
        return "baseInterface";
    }

    public String otherBaseMethod(){
        return "otherBaseMethod";
    }

}

public class ClassA implements IBaseInterface{

    @Override
    public String baseMethod() {
        return "ClassA";
    }

    public String getAttribiuteA(){
        return "A";
    }

}

public class ClassB implements IBaseInterface {

    @Override
    public String baseMethod() {
        return "ClassB";
    }

    public String getAttribiuteB(){
        return "B";
    }

}

现在我有两种非常相似的方法:

private String getBaseMethod(){

    /** Do something */

    if(/**    */){
        BaseClass base = new BaseClass();
        return base.baseMethod();
    }else if (/**    */){
        ClassA a = new ClassA();
        return a.baseMethod();
    } else {
        ClassB b = new ClassB();
        return b.baseMethod();
    }
}

private String getOtherMethod(){

    /** Do something */

    if(/**    */){
        BaseClass base = new BaseClass();
        if(/**    */){
            return base.baseMethod();
        } else{
            return base.otherBaseMethod()
        }
    } else if(/**    */){
        ClassA a = new ClassA();
        return a.getAttribiuteA()
    } else{
        ClassB b = new ClassB();
        return b.getAttribiuteB();
    }
}

这两种方法非常相似。 if 子句中的条件相同。我们可以改进这两种方法吗?更“抽象”?

我无法在我的课程中进行任何更改,只能在方法中进行更改。


我认为这里要求的是使用“多态性”

因为所有三个类,BaseClass、ClassA 和 ClassB 都实现了 IBaseInterface 接口,所以你可以像下面的例子那样做:

 IBaseInterface i1 = new BaseClass();
 IBaseInterface i2 = new ClassA();
 IbaseInterface i3 = new ClassB();

正如您此时已经注意到的那样,您也可以使用 List 来保存您的类。

 List<IBaseInterface> interfaces = new ArrayList<>();
 interfaces.add(i1);
 ....

等等

因为 IBaseInterface 具有方法 baseMethod(),所以现在您可以简单地迭代列表并为每个 IBaseInterface 对象调用 baseMethod() 方法。

看看“多态行为”

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

如何重构两个非常相似的方法 的相关文章

随机推荐

  • 如何计算 pandas 中事件之间的时间

    原始问题 我陷入了以下问题 我试图找出车辆在工厂存放的具体时间和时间 我有一个 Excel 工作表 其中存储了所有事件 这些事件要么是交付路线 要么是维护事件 最终目标是获得一个数据帧 其中给出了车辆登记号以及相应的到达工厂和在那里花费的时
  • GWT - DialogBox.center() 无法正常工作

    我的页面上有一个带有按钮的表格 按钮太多了 我有一个滚动条可以向下滚动表格 按钮 onClick 生成一个对话框 其中包含滚动面板 内容和用于关闭该对话框的按钮 我使用 DialogBox center 将其居中 当我按下表格中的第一个按钮
  • 如何将模拟器连接到 laravel 服务器 localhost:8000

    当我的 Android 应用程序使用 10 0 0 2 8080 连接到 wampserver 中的项目时 我可以连接到 localhost 8080 但我使用 laravel 并且我的 Web 服务位于 localhost 8000 我想
  • Bootstrap 响应式附加菜单

    我想要一个固定菜单 如引导文档 http twitter github com bootstrap base css html 与引导文档上一样 它没有贴在手机上 我有以下代码 div class container div class r
  • 为什么我应该将实现的接口方法声明为“公共”?

    interface Rideable String getGait public class Camel implements Rideable int weight 2 String getGait return mph lope voi
  • 如何在 Windows 10 Powershell 上使用 npm 脚本递归复制整个目录?

    如何在 Windows 10 Powershell 上使用 npm 脚本递归复制整个目录 现在我有以下树 test 1 package json 2 src asd txt asd asd Copy 2 txt asd Copy txt a
  • 如何从通过 Javascript 加载的页面上 __scrape__ 数据

    我想使用 beautifulsoup 刮掉此页面上的评论 https www x s com video id the suburl 评论通过 JavaScript 在点击时加载 评论是分页的 每个页面也会在点击时加载评论 我希望获取所有评
  • Eclipse 的选项卡双击 Visual Studio?

    在 Eclipse 上 每当我双击选项卡时 它就会填充工作区 通过隐藏所有其他视图 如项目树 控制台等 有没有办法在 Visual Studio 上做到这一点 注意 我不是在寻找全屏 只是想要一种整理工作区但仍然可以访问菜单的方法 你在追寻
  • 训练过程中GAN结果图像是相同的

    我正在尝试在 MNIST 数据集上训练 GAN 该代码现在的训练结果好坏参半 问题似乎是生成的图像实际上都是相同的 您可以在下面找到我的完整代码 我尝试环顾四周 看看是否有解决方案 我发现唯一提到的使用randn代替rand但我没有使用ra
  • Summernote 显示已上传到文件夹的图像

    我正在使用非常好的 Summernote 编辑器来构建一个小型网络应用程序 我没有使用图像的默认内联 base64 代码 而是将图像存储在文件夹中 我让那部分按预期工作 我可以单击 图像 图标并选择一个图像 它会以其原始类型 jpg png
  • 如何在网站上嵌入Python解释器

    我正在尝试建立一个教育编码网站 类似于代码学院 http www codecademy com 但坦率地说 我不知道应该采取什么步骤 我能否指出正确的方向 在 web 应用程序中包含一个简单的 python 解释器 一种选择可能是使用 Py
  • 调试时模拟 argparse 命令行参数输入

    该线程是上一个线程的扩展 可以找到here https stackoverflow com questions 50881403 debugging argpars in python 比如说 我有一个代码有两个用途 1 从整数列表中打印最
  • 对未经身份验证的用户和 AJAX 调用的不同响应

    我的 ASP MVC 1 0 网站有一个默认登录页面 基于 OpenId 但这不应该有什么不同 当 AuthorizedAttribute 位于操作 控制器上时 它可以正常工作 不过 我也收到了 AJAX 请求 以下是我对它们所做的事情 i
  • 设置 IPython Notebook 内联图背景不透明

    在 IPython Notebook 3 中 当我使用Inlinematplotlib后端 浏览器中的png图形具有透明背景 我该如何将其设置为白色 最小的例子 matplotlib inline import matplotlib pyp
  • Apache 虚拟主机(子域)访问 LAN 上的不同计算机

    我目前正在尝试配置 Apache HTTP Server 的虚拟主机 子域 以便可以通过 LAN 上的另一台计算机访问它 Apache 与 PHP 和 MySQL 的当前设置在同一台物理机器上本地运行 因此 我有两个虚拟主机设置 开发和 c
  • 根据自定义产品属性值过滤 Woocommerce 产品

    在 Woocommerce 中 我有一个名为restriction id 我想根据某些条件过滤产品限制 ID 例如 如果一个值设置为35在 php 会话变量中 我想过滤掉任何将restriction id 属性设置为的产品35 我会在这里放
  • WPF 和 WinForms 有什么区别?

    我正在编写简单的 Windows 应用程序 我不需要数据库支持 为什么我要使用 WPF 而不是 WinForms 一个明显的答案是 WPF 提供了比 WinForms 更丰富的用户体验 例如允许在用户界面中使用动画 甚至 3D 从开发的角度
  • “numpy.einsum”中的“out”参数无法按预期工作

    我有两段代码 第一个是 A np arange 3 4 3 reshape 3 4 3 P np arange 1 4 A 1 np einsum j ijk gt ijk P A 1 和结果A is array 0 1 2 6 8 10
  • 有人知道为什么 IE9 typeof console.log 报告“对象”,其他报告“功能”吗?

    在 Firefox Chrome 其他浏览器中 typeof console log 报告 function 在 IE9 中 假设开发者控制台已打开 从而定义了 window console 属性 如果在开发者控制台中显示变量 consol
  • 如何重构两个非常相似的方法

    我有以下课程 public interface IBaseInterface String baseMethod public class BaseClass implements IBaseInterface Override publi