Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go中的面向对象(多态) 我算是彻底玩明白了

Go中的面向对象(多态) 我算是彻底玩明白了

作者头像
兔云小新LM
发布于 2023-08-09 00:57:24
发布于 2023-08-09 00:57:24
94800
代码可运行
举报
运行总次数:0
代码可运行

大家伙,我是Mandy。

上一篇,我们分享了在Go中是如何实现面向对象,文章中对面向对象的三大特性中的继承、封装,做了一个理论和实践的总结,这一篇继续分享关于另外一个特性,那就是多态。

认识多态

老规矩,在代码实践之前,先对基础知识做一个普及。

1、面向对象中的多态(Polymorphism)是指一个对象可以具有多种不同的形态或表现方式。简单来说,就是同一个类型的对象,在不同的上下文中表现出不同的行为。多态性是面向对象的三大特性之一(封装、继承、多态)。

2、在多态中,父类的引用可以指向子类的对象,通过父类的引用调用子类的方法。这样可以实现代码的灵活性和扩展性,可以根据具体的对象类型调用相应的方法,无需关心对象的具体类型。

3、通过多态性,可以通过统一的接口来处理不同的对象,实现代码的简洁性和可维护性。多态性提供了一种抽象的方式来处理对象的不同行为,使得代码更具灵活性和可扩展性。

总结一句,就是同一个方法在不同的对象实例中,可以有不同的行为。这里简单用PHP举一个案例。

在PHP中实现多态需要遵循以下几个步骤:

1、创建父类(基类):定义一个包含通用方法和属性的父类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Animal {
  public function makeSound() {
    echo "Animal makes sound.";
  }
}

2、创建子类(派生类):继承父类,并添加自己特定的方法和属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Dog extends Animal {
  public function makeSound() {
    echo "Dog barks.";
  }
}

class Cat extends Animal {
  public function makeSound() {
    echo "Cat meows.";
  }
}

3、创建对象并调用方法:通过父类的引用来实例化子类对象,可以根据具体的对象类型调用相应的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$animal1 = new Dog();
$animal1->makeSound(); // Output: Dog barks.

$animal2 = new Cat();
$animal2->makeSound(); // Output: Cat meows.

通过以上步骤,我们可以实现多态性,即相同父类类型的对象(例如Animal),在不同的对象实例下调用相应的子类方法(例如Dog或Cat)。这样就实现了多态的效果。

Go语言实现

因为Go中没有面向对象的概念,但根据多态的定义和特点,我们可以使用Go中的interface来实现多态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type Animal interface {
 run()
}

type Turtle struct {
}

func (t Turtle) run() {
 fmt.Println("乌龟爬行很慢")
}

type Rabbit struct {
}

func (r Rabbit) run() {
 fmt.Println("兔子跑步很快")
}

func main() {
 var animal Animal
 // 实例化一个Turtle对象
 animal = &Turtle{}
 animal.run()

 // 实例化一个Rabbit对象
 animal = &Rabbit{}
 animal.run()
}

1、首先我们定义了一个Animal的接口,并在接口中定义了一个约束,就是run()方法。

2、接着我们定义了Turtle和Rabbit两个结构体,并分别定义了一个run()方法。

3、此时两个结构体隐式的实现了Animal接口中的方法。

4、根据多态的特性,两个结构体中的方法,都可以具备自己的行为。我们在两个方法中分别打印了内容,此时能够打印出不同的内容。不同的内容就可以理解为不同的行为,当然你也可以在这个方法中做其他的操作。

5、在main()方法中,创建一个Animal的变量,并通过不同的结构体实例,调用相同的方法名,最终输出不同的内容。

实战案例

上面对多态有了一定的了解,接着列举一个实战的案例。

在系统支付,一般我们会对接微信和支付宝这样的平台,大致的流程就是,创建订单记录->组装支付参数->发起支付请求->支付平台进行回调通知->修改订单支付状态。

基于这样的逻辑,我们使用一个Pay接口,定义三个方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Pay interface {
 createOrder() // 创建订单
 createPay()   // 常见支付参数
 notifyPay()   // 回调通知
}

接着定义具体的实现类,就是微信支付和支付宝支付。

1、定义一个微信支付,用来实现接口中的三个方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type WeChat struct {
 // 微信支付方式
}

func (a WeChat) createOrder() {
 fmt.Println("我是微信支付,现在我正在创建订单数据,用于记录到数据库中。")
}

func (a WeChat) createPay() {
 fmt.Println("我是微信支付,现在我正在创建支付数据,用于向微信发起支付请求使用。")
}

func (a WeChat) notifyPay() {
 fmt.Println("我是微信支付,现在我正在接受微信通知的参数,用于修改用户订单支付状态。")
}

2、定义一个支付宝支付,用来实现接口中的三个方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Ali struct {
 // 支付宝支付方式
}

func (a Ali) createOrder() {
 fmt.Println("我是支付宝支付,现在我正在创建订单数据,用于记录到数据库中。")
}

func (a Ali) createPay() {
 fmt.Println("我是支付宝支付,现在我正在创建支付数据,用于向支付宝发起支付请求使用。")
}

func (a Ali) notifyPay() {
 fmt.Println("我是支付宝支付,现在我正在接受支付宝通知的参数,用于修改用户订单支付状态。")
}

接下来,就来进行实际的订单操作。

1、假设当前的支付渠道使用的是微信支付。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
 var pay Pay
 pay = &WeChat{}
 pay.createOrder()
 pay.createPay()
 pay.notifyPay()
}

最终输出的结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
我是微信支付,现在我正在创建订单数据,用于记录到数据库中。
我是微信支付,现在我正在创建支付数据,用于向微信发起支付请求使用。
我是微信支付,现在我正在接受微信通知的参数,用于修改用户订单支付状态。

2、假设当前的支付渠道使用的是支付宝支付。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
 var pay Pay
 pay = &Ali{}
 pay.createOrder()
 pay.createPay()
 pay.notifyPay()
}

最终输出结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
我是支付宝支付,现在我正在创建订单数据,用于记录到数据库中。
我是支付宝支付,现在我正在创建支付数据,用于向支付宝发起支付请求使用。
我是支付宝支付,现在我正在接受支付宝通知的参数,用于修改用户订单支付状态。

到此,在Go中实现面向对象以及三大特性(封装、继承和多态)就给大家分享完毕。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 菜鸟成长学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go基础之--接口
定义 在Go语言中,一个类只要实现了接口要求的所有函数,我们就说这个类实现了该接口 interface类型可以定义一组方法,用来表示一个对象的行为特征,interface不能包含任何变量,接口是引用类型。 举个简单的例子,一个动物的接口,动物有吃的能力,有叫的能力,等等,这里省略,假如动物就只有吃和叫的能力。 package main import "fmt" type Animal interface { Eat() Talk() } type Dog struct{ } fun
coders
2018/03/30
5720
面向对象的三大特性
继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 1 class ParentClass1: #定义父类 2 pass 3 4 class ParentClass2: #定义父类 5 pass 6 7 class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass 8 pas
人生不如戏
2018/04/12
6770
面向对象的三大特性(封装、继承、多态)
继承 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2
用户1214487
2018/01/23
4.2K0
面向对象的三大特性(封装、继承、多态)
day 25-1 接口类、抽象类、多态
这是三种动物 tiger      走路  游泳 swan     走路  游泳 飞 oldying  走路  飞
py3study
2020/01/17
4280
Python之面向对象二
面向对象的三大特性: 继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class Animal: def __init__(self,name,aggr,hp): self.name = name self.aggr = aggr self.hp = hp self.func() def func(se
新人小试
2018/04/12
8310
Python之面向对象二
面向对象:封装,多态
1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了⼀个很⽜B的函数. 那这个也可以被称为封装. 在⾯向对象思想中. 是把⼀些看似⽆关紧要的内容组合到⼀起统⼀进⾏存储和使⽤. 这就是封装.
changxin7
2019/08/14
7370
面向对象:封装,多态
客户决策 | 我的代码没有else
「策略模式」比较简单,大家平常工作中应该经常使用到,所以本文作为复习,帮助大家温故知新。我们先来看下定义:
用户1093396
2020/10/28
9820
客户决策 | 我的代码没有else
day22-day28-面向对象
day22-day23初识面向对象,面向对象的小例子,组合的使用# 人和狗的战争class Dog: def __init__(self, name, aggr, hp, kind): # 定义一条狗的属性 self.name = name # 初始化属性 self.aggr = aggr self.hp = hp self.kind = kind def bite(self, person_obj): # 将人对象作为参数传入,即对
少年包青菜
2019/09/11
4060
python3--归一化设计,接口类和抽象类,接口隔离原则,多态
2 声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
py3study
2018/08/02
2.5K0
【IT领域新生必看】多态的优点:揭开面向对象编程的神秘面纱
在计算机科学的广阔天地中,面向对象编程(OOP)是一颗璀璨的明珠,而多态性(Polymorphism)正是这颗明珠中最令人惊叹的特性之一。多态性这个术语来源于希腊语,意思是“多种形式”。在编程的世界里,多态性让同一个接口或基类在不同的上下文中可以表现出不同的行为。对于编程初学者来说,理解多态性可能有些抽象,但它的实际应用却无处不在,且极其强大。本篇文章将带你深入了解多态的魅力,从基础概念到高级应用,逐步揭开它的神秘面纱。
E绵绵
2024/07/12
1240
一个支付案例,学会策略模式!
在开发时,总会遇到支付的需求,但是支付的方式有很多,支付宝支付,微信支付,银行卡支付,每种支付方式的接口不一样,参数信息也不一样,一般情况下,会有很多if/else来进行判断,但是业务逻辑的逐渐增多,if/else显得那么的沉重,通过策略模式即可更优雅的来处理这种代码。
架构师修炼
2021/04/12
7030
【JavaSE专栏59】方法重写的概念及优先级问题,面向对象的多态性机制
方法重写是 Java 中一种实现多态性的机制。当子类继承自父类时,子类可以重写父类中已经存在的方法,以实现自己的特定逻辑或行为。方法重写要求子类中的方法与父类中被重写的方法具有相同的方法名称、参数列表和返回类型。
Designer 小郑
2023/08/02
2940
【JavaSE专栏59】方法重写的概念及优先级问题,面向对象的多态性机制
Go面向对象 看这篇文章就够了
前面一篇,分享了Go中的函数和方法之间有什么区别、如何使用,今天来分享一篇关于面向对象的知识。
兔云小新LM
2023/08/01
3490
Go面向对象 看这篇文章就够了
大数据必学Java基础(八十八):通过案例和概念体会反射的好处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象, 都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
Lansonli
2022/12/13
3870
大数据必学Java基础(八十八):通过案例和概念体会反射的好处
go之面向对象 封装、继承、多态
学习面向对象之前,应该搞清楚,什么是面向对象?为什么用面向对象?以及使用面向对象有什么优缺点?不了解的同学可以找google 或baidu,此篇不再赘述。
IT工作者
2022/06/30
4690
Go语言策略模式
在Go语言中,可以使用策略模式来实现一种灵活的代码结构,以便根据不同的策略来执行相应的行为。策略模式允许我们在运行时动态地选择算法或行为,而无需修改主要的业务逻辑。下面是一个使用策略模式的具体例子:
copy-happly
2024/01/14
1540
GOF23—工厂设计模式练习代码和随笔
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100724.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/30
1700
GOF23—工厂设计模式练习代码和随笔
Spring中使用模板方法模式(接上文)
接上一篇文章末尾提出的扩展点,本次进行实现。上文链接:Spring项目中使用策略模式+工厂模式
sgr997
2022/11/10
2970
Spring中使用模板方法模式(接上文)
【Java 基础篇】Java多态:发挥对象的多重形态
多态是面向对象编程中的一个重要概念,它允许一个对象表现出多种形态。在Java中,多态性通过继承和方法重写实现,它使得代码更加灵活、可扩展和可维护。本篇博客将围绕Java多态展开讨论,包括多态的概念、实现方式、用法以及多态带来的优势。
繁依Fanyi
2023/10/12
3730
【JavaSE专栏63】多态,父类引用子类的对象,面向对象编程中的重要概念
本文讲解了 Java 中面向对象多态的概念及语法,并给出了样例代码。多态是面向对象编程中的一个重要概念,它允许使用父类的引用变量来引用子类的对象,实现对不同子类对象的统一处理。
Designer 小郑
2023/08/02
5510
【JavaSE专栏63】多态,父类引用子类的对象,面向对象编程中的重要概念
相关推荐
Go基础之--接口
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验