首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

您如何重构此条件以使用多态?

在编程中,多态是一种允许对象采用多种形式的特性。在面向对象编程中,多态可以让你使用一个接口来表示多种类型的对象。这样,你可以编写更灵活、可扩展的代码。

要重构条件以使用多态,你需要考虑以下几个步骤:

  1. 确定共同的接口或基类:首先,你需要确定哪些类共享相同的属性和方法。然后,创建一个接口或基类,包含这些共享的属性和方法。
  2. 实现接口或继承基类:接下来,让你的类实现这个接口或继承这个基类。这样,这些类就可以使用接口或基类中定义的方法。
  3. 使用多态:现在,你可以使用多态来编写代码。例如,你可以创建一个接受该接口或基类类型的方法,并在其中调用共享的方法。这样,你的代码就可以处理不同类型的对象,而不需要了解它们的具体实现。

这是一个简单的示例,说明如何在Python中使用多态:

代码语言:python
复制
# 定义一个接口,即一个包含共享方法的基类
class Shape:
    def area(self):
        pass

# 实现接口的子类
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14159 * self.radius ** 2

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

# 使用多态
def print_area(shape):
    print(shape.area())

circle = Circle(5)
rectangle = Rectangle(4, 6)

print_area(circle)
print_area(rectangle)

在这个例子中,我们定义了一个名为Shape的接口,包含一个名为area的方法。然后,我们创建了两个实现了Shape接口的类:CircleRectangle。最后,我们编写了一个名为print_area的函数,该函数接受一个Shape类型的参数,并调用其area方法。这样,我们可以使用print_area函数来打印不同类型的形状的面积,而不需要了解它们的具体实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

代码重构(四):条件表达式重构规则

说白了也就是不同的条件有着同样的返回结果。当然一般在你程序设计之初不会出现问题,因为在我们设计程序时,如果不同的条件返回相同的结果,我们肯定会将其合并的。...在上述夸张的Demo中一眼就能看出来如何进行重构了(在日常开发迭代中,因为业务逻辑的复杂性或者多次迭代的原因,往往不是那么一目了然)。接下来我们就要对不同条件,但返回相同结果的部分进行合并。...六、Replace Condition with Polymorphism(多态取代条件表达式) 在介绍“多态取代条件表达式”之前呢,首先要理解面向对象中多态是什么,也就是说多态是干嘛的。...如果想使用多态,引入其他类是必不可少的,而且每个类中也必须有相应的对应关系。“多态取代条件表达式”的做法的本质是将不同状态的业务逻辑的处理的代码移到相应的类中。...这样一来,我们就把每个分支中的业务逻辑进行了分离,并使用多态来获取价格。重构后的优点不言而喻。 ? 今天关于“条件表达式的重构”的规则,当然这不是全部的,只是列举了一些常见的,而且经常使用重构规则。

1.5K90

如何 “干掉” if...else

使用好 if...else 不仅对于现在,而且对于将来,都是十分有意义的。今天我们就来看看如何“干掉”代码中的 if...else,还代码清爽。...在程序执行时,通过对比入参与注解中定义的条件是否匹配,再决定是否调用方法。具体实现时,可以采用表驱动或职责链的方式实现。 适用场景 适合条件分支很多多,对程序扩展性和易用性均有较高要求的场景。...方法八:多态 介绍 使用面向对象的多态,也可以起到消除 if...else 的作用。...,无法体现适合使用多态消除 if...else 的具体场景。...一般来说,当一个类中的多个方法都有类似于示例中的 if...else 判断,且条件相同,那就可以考虑使用多态的方式消除 if...else。 同时,使用多态也不是彻底消除 if...else。

86920

如何解决代码中 if…else 过多的问题?

使用好 if...else 不仅对于现在,而且对于将来,都是十分有意义的。今天我们就来看看如何“干掉”代码中的 if...else,还代码清爽。...在程序执行时,通过对比入参与注解中定义的条件是否匹配,再决定是否调用方法。具体实现时,可以采用表驱动或职责链的方式实现。 适用场景 适合条件分支很多多,对程序扩展性和易用性均有较高要求的场景。...方法八:多态 介绍 使用面向对象的多态,也可以起到消除 if...else 的作用。...,无法体现适合使用多态消除 if...else 的具体场景。...一般来说,当一个类中的多个方法都有类似于示例中的 if...else 判断,且条件相同,那就可以考虑使用多态的方式消除 if...else。 同时,使用多态也不是彻底消除 if...else。

2.1K20

如何解决代码中if…else 过多的问题

使用好 if...else 不仅对于现在,而且对于将来,都是十分有意义的。今天我们就来看看如何“干掉”代码中的 if...else,还代码清爽。...在程序执行时,通过对比入参与注解中定义的条件是否匹配,再决定是否调用方法。具体实现时,可以采用表驱动或职责链的方式实现。 适用场景 适合条件分支很多多,对程序扩展性和易用性均有较高要求的场景。...方法八:多态 介绍 使用面向对象的多态,也可以起到消除 if...else 的作用。 使用场景 链接中给出的示例比较简单,无法体现适合使用多态消除 if...else 的具体场景。...一般来说,当一个类中的多个方法都有类似于示例中的 if...else 判断,且条件相同,那就可以考虑使用多态的方式消除 if...else。 同时,使用多态也不是彻底消除 if...else。...如何解决 对于 if...else 表达式复杂的问题,主要用代码重构中的抽取方法、移动方法等手段解决。因为这些方法在《代码重构》一书中都有介绍,所以这里不再重复。

2.9K70

Coding 是门技术

【强制】 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释,使用/* */注释,注意与代码对齐。...艾尔莎掌握了书中“Replace Conditional with Polymorphism(多态取代条件式)”的精髓,并且开始一步步尝试。...紧急需求来临时,无需关注每个状态的处理,只需关注对应的状态的实现,进行处理即可; 艾尔莎这么重构,会有什么效果?官方定论。 1. 在面向对象术语中,听上去最高贵的词非“多态”莫属。...多态最更根本的好处就是:如果你需要根据对象的不同型别而采取不同的行为,多态使你不必编写明显的条件式; 2....如果感觉有意思,那么在实际开发中,如果你也遇到大批量的 switch/case、if/else 不妨采取方案尝试进行重构一下。 03.

37620

虚函数&多态

由输出可以看,两个调用输出的都是Animal自己的speak( )函数,这不符合我们的要求,所以引入了虚函数,来解决问题;因此在基类的成员函数定义前加virtual: 1 #include<iostream...(5)限制条件: 非类的成员函数不能定义为虚函数,类的成员函数中静态函数、构造函数也不能定义为虚函数,但是析构函数可以被定义为虚函数; 当基类中的某一成员函数声明为虚函数后,派生类中的同名函数(函数名相同...运行时,为动态多态,具体引用的对象要在运行时才能确定; 编译时,为静态多态,在编译时就可以确认对象使用的形式。 (1)定义:多态是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。...(2)实现方法:C++中,实现多态可以通过虚函数、抽象类、覆盖、模板(重构多态无关)。...重构就能够最大限度的避免这样一种现象。系统发展到一定阶段后,使用重构的方式,不改变系统的外部功能,只对内部的结构进行重新的整理。

1.1K10

重构-改善既有代码的设计:重新组织数据的16种方法(六)

更重要的是:任何switch语句都应该运用Replace Conditional with Polymorphism (多态取代条件表达式)去掉。...这种情况下,你应该以 Replace Conditional with Polymorphism (多态取代条件表达式)进行重构。...Replace Type Code with Subclass (子类取代类型码)的主要作用其实是搭建一个舞台,让Replace Conditional with Polymorphism (多态取代条件表达式...如果没有多态机制,就必须找到所有条件表达式,并逐一修改它们。因此,如果为了还有可能加入新行为,这项重构将特别有价值。...如果你打算在完成本重构后再以Replace Conditional with Polymorphism (多态取代条件表达式)简化一个算法,那么选择Strategy模式较合适;如果你打算搬移状态相关的数据

52120

编码时的"五行代码"原则

简短的方法还使的更改更加本地化和可追溯,从而降低了错误和冲突的风险。 它使的代码更具可扩展性: 短方法比长方法更容易重用,因为它具有更多的抽象和封装、更多的多态性和继承性以及更多的组合和委托。...简短的方法还可以使的代码更加模块化和解耦,从而增加其灵活性和适应性。 五行代码怎么写? 以下是帮助您编写五行代码的一些技巧: 了解的语言: 熟悉正在使用的编程语言、它的语法、内置函数和库。...使用内置函数和库: 使用内置函数、库和框架可以帮助您降低代码复杂性和简化程序逻辑。 保持简单: 避免复杂的逻辑、嵌套循环或过多的条件语句。...由于我们对购物车中的每个项目都进行了计算,因此将其包装在一个函数中是有意义的。我们可以命名这个函数calculate_item_price。 第 3 步:为新函数指定一个描述性名称,解释其作用。...calculate_total(cart) cart.reduce(0) do |total, item| total + calculate_item_price(item) end end 我们已经使用五法则成功地重构了它

19220

写出优质Java代码的4个技巧

现在可以重构我们之前的条件,如下: ? 除了可以在系统中减少复制,重构默认的equals方法还有一些其它的优势。...尽量多使用多态性 对于任何一门编程语言来说,条件句都是一种很常见的结构,而且它的存在也是有一定原因的。因为不同的组合可以允许用户根据给定值或对象的瞬时状态改变系统的行为。...在条件设计中,没有这样的检查,确保每个类型都有一个case语句。如果添加了新类型,我们可以简单地忘记更新每个switch语句。这个问题越严重,我们就越重复我们的switch语句。...将条件逻辑替换成多态类是非常常见的,因此已经发布了将条件语句重构多态类的方法。此外,Martin Fowler的《重构》(255页)也描述了执行这个重构的详细过程。...就像本文中的其他技术一样,对于何时执行从条件逻辑转换到多态类,没有硬性规定。事实上,如论在何种情况下我们都是不建议使用

80370

6个实例详解如何把if-else代码重构成高质量代码

如果使用if-else,说明if分支和else分支的重视是同等的,但大多数情况并非如此,容易引起误解和理解困难。 是否有好的方法优化?如何重构? 方法肯定是有的。...这里用到的重构方法是:将条件反转使异常情况先退出,让正常流程维持在主干流程。...代码结构和逻辑上清晰,能一下看出来每一个条件内做的功能。 状态处理型重构方法实例二 针对状态处理的代码,一种优雅的做法是用多态取代条件表达式(《重构》推荐做法)。...0:getBaseSpeed(_voltage); } } 可以看到,使用多态后直接没有了if-else,但使用多态对原来代码修改过大,需要一番功夫才行。最好在设计之初就使用多态方式。...针对状态处理型重构方法有两种:一种是把不同状态的操作封装成函数,简短if-else内代码行数;另一种是利用面向对象多态特性直接干掉了条件判断。

1.2K10

Java中我如何去除if...else...语句?

读《重构 改善既有代码的设计》有一条就是,多态取代条件表达式。这是才是最本质的解决方式。 这里的去除if…else…语句,不是遇见了if…else…语句就去除。...多态取代条件表达式 代码的坏味道一: double getSpeed() { switch_ (_type) { case EUROPEAN: return getBaseSpeed...动机(为什么我们要使用多态取代条件表达式?) 多态最根本的好处就是:如果你需要根据对象的不同类型而采取不同的行为,多态使你不必编写明显的条件表达式。 类图 ?...小结 由于偶然读到别人技术博客关于if…else…的取代文章,发现这也是一个思路,但是不够那么好,于是记录下《重构 改善既有代码设计》的一个多态取代条件表达式的范例。...虽然这样确实处理了if…else…语句,但是一旦使用多态取代条件表达式的方式,必定会引入一个继承或者实现体系,其实,这是增加了理解的复杂度。

1.8K10

写出优质Java代码的4个技巧

4.尽量多使用多态性 对于任何一门编程语言来说,条件句都是一种很常见的结构,而且它的存在也是有一定原因的。因为不同的组合可以允许用户根据给定值或对象的瞬时状态改变系统的行为。...在条件设计中,没有这样的检查,确保每个类型都有一个case语句。如果添加了新类型,我们可以简单地忘记更新每个switch语句。这个问题越严重,我们就越重复我们的switch语句。...,因此已经发布了将条件语句重构多态类的方法。...此外,马丁·福勒(Martin Fowler)的《重构》(p . 255)也描述了执行这个重构的详细过程。 就像本文中的其他技术一样,对于何时执行从条件逻辑转换到多态类,没有硬性规定。...经验和合理的判断将决定何时是将条件代码转换为多态代码的合适时间。 结束语 作为程序员,尽管平常所使用的常规技术可以解决大部分的问题,但有时我们应该打破这种常规,主动需求一些创新。

1.8K00

写出优质Java代码的4个技巧

4.尽量多使用多态性 对于任何一门编程语言来说,条件句都是一种很常见的结构,而且它的存在也是有一定原因的。因为不同的组合可以允许用户根据给定值或对象的瞬时状态改变系统的行为。...在条件设计中,没有这样的检查,确保每个类型都有一个case语句。如果添加了新类型,我们可以简单地忘记更新每个switch语句。这个问题越严重,我们就越重复我们的switch语句。...,因此已经发布了将条件语句重构多态类的方法。...此外,马丁·福勒(Martin Fowler)的《重构》(p . 255)也描述了执行这个重构的详细过程。 就像本文中的其他技术一样,对于何时执行从条件逻辑转换到多态类,没有硬性规定。...经验和合理的判断将决定何时是将条件代码转换为多态代码的合适时间。 结束语 作为程序员,尽管平常所使用的常规技术可以解决大部分的问题,但有时我们应该打破这种常规,主动需求一些创新。

53010

业务代码如何才能不再写出大串的ifelse?

if 缩进很多时候都是在检查某先决条件条件通过时,才能执行后续代码。 这样的代码可使用卫语句(guard clause),即设置单独检查条件,不满足该检查条件时,方法立刻返回。...卫语句取代嵌套的条件表达式(Replace Nested Conditional with Guard Clauses)。...根据文章信息进行收费: 不用 else,简单方式就是让每个逻辑提前返回,类似卫语句: 业务简单的代码,这重构还很轻松,但对复杂代码,就得上多态了。...解决方案:多态取代条件表达式(Relace Conditional with Polymorphism)。...引入 UserLevel 模型,消除 switch: 前面代码即可去掉 switch: switch 其实就是一堆“ if…else” 的简化写法,二者等价,所以,这个重构手法,多态取代的是条件表达式

76210

开发中滥用面向对象,你是否违背了编程原则

面向对象中的多态概念可为此带来优雅的解决办法。 大多数时候,一看到 switch 语句,就应该考虑多态来替换它。 解决方法 问题是多态该出现在哪?...一旦完成这样的继承结构后,就可以运用 多态取代条件表达式(Replace Conditional with Polymorphism) 了。...如果条件分支并不多并且它们使用不同参数调用相同的函数,多态就没必要了。...多态取代条件表达式(Replace Conditional with Polymorphism) 问题 你手上有个条件表达式,它根据对象类型的不同而选择不同的行为。...重构方法说明 委托取代继承(Replace Inheritance with Delegation) 问题 某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。 ?

78140

写出优质Java代码的4个技巧

4.尽量多使用多态性 对于任何一门编程语言来说,条件句都是一种很常见的结构,而且它的存在也是有一定原因的。因为不同的组合可以允许用户根据给定值或对象的瞬时状态改变系统的行为。...在条件设计中,没有这样的检查,确保每个类型都有一个case语句。如果添加了新类型,我们可以简单地忘记更新每个switch语句。这个问题越严重,我们就越重复我们的switch语句。...,因此已经发布了将条件语句重构多态类的方法。...此外,马丁·福勒(Martin Fowler)的《重构》(p . 255)也描述了执行这个重构的详细过程。 就像本文中的其他技术一样,对于何时执行从条件逻辑转换到多态类,没有硬性规定。...经验和合理的判断将决定何时是将条件代码转换为多态代码的合适时间。 结束语 作为程序员,尽管平常所使用的常规技术可以解决大部分的问题,但有时我们应该打破这种常规,主动需求一些创新。

38610

整洁代码之道——重构

理解了重构是做什么,重构的作用,为什么要重构,以及重构的时机,我们对重构有了初步认识,接下来笔者重点篇幅来讲解如何使用重构技巧去优化代码质量达成Clean Code ....多态取代条件表达式:如果有个条件表达式根据对象类型的不同选择而选择不同的行为,将条件表达式的每个分支放进一个子类内的覆写函数中,将原始函数声明为抽象函数。...这种重构技巧适合于比较简单的条件表达式场景,下面是比较复杂的没有返回值的条件表达式场景,我们去看看如何处理。 反射去除分支结构 原始的条件表达式代码如下图1所示: (点击放大图像) ?...多态取代条件表达式 (点击放大图像) ? 图3 重构后的案例结果图 (点击放大图像) ? 图4 重构后的案例-多态如何使用 (点击放大图像) ? 图5 重构后的代码结构图 (点击放大图像) ?...为了分解条件表达式,笔者采取了多态重构技巧去实现,具体有两种实现方式,第一种实现方式是采用抽象类去实现多态,代码结构图如图5 passenger文件夹,UML类图如上图6所示。

1.4K60

重构方法与实践笔记

使用单元测试;分层测试;UI自动化测试 2....- 难以维护 - 容易出现bug - 破窗效应 优秀函数的原则: 函数一般写10行 超过20行就考虑重构 第一条规则是短小 第二条规则还是短小 如何处理条件语句 - 函数提取:即按照逻辑拆分子函数...- 分解表达式 - 多态处理堆叠的条件表达式(如switch) - 状态模式 - 策略模式 - 将条件表达式转换为查找表,使用注解完成映射 2.4 进阶优化 组合函数(Composed Method...粘滞性 个人因素 - 代码阅读能力 - 重构方法的掌握 环境因素 - 时间,如需求倒排 3.2 面向对象 3.2.1 三大特性 - 抽象 - 继承 - 多态 3.2.2 设计原则 使用接口进行解偶...- 单一职责 - 接口设计 - 依赖倒置原则 - 接口分离原则 - 接口隔离原则 - 一个类要尽可能不依赖外部 - 高内聚、低耦合 - 开闭原则 - 迪米特法则 - 如何处理父子关系 -

87400

高质量代码究竟依赖设计还是重构而来?

分解条件表达式合并条件表达式卫语句取代嵌套条件表达式多态取代条件表达式引入特例引入断言 分解条件表达式 合并条件表达式 卫语句取代嵌套条件表达式 多态取代条件表达式 引入特例 引入断言 我们看看哪些建议可以用得上...1.2.2 重构方式 2:多态取代条件表达式 仅仅做了分解条件表达式就够了吗,肯定不够。...因此,我们对这段代码进行了多轮重构,从一开始分解条件表达式,到采用多态使得代码在结构上更为清晰,进一步地采用了策略模式和模板方法模式,不断提升了代码质量。...那么该如何正确地使用注释呢?可以用注释说明以下内容: 解释代码完成的是什么;解释代码为什么完成这些工作;提供其他信息,如使用指南。...《重构》这本书中对重构的定义是:“所谓重构(refactoring)是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,改进程序的内部结构。

21331
领券