七、Go 语言面向对象编程

举报
毛利 发表于 2021/07/15 02:42:41 2021/07/15
2.2k+ 0 0
【摘要】 @Author:Runsen 在 Go 语言中没有类(Class)的概念,但这并不意味着 Go 语言不支持面向对象编程,毕竟面向对象只是一种编程思想。对于面向对象编程的支持Go 语言设计得非常简洁而优雅。 下面,我们主要介绍下Go面向对象编程的三大特性:封装、继承和多态。 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式继承:使得子类具有父类的属性和方法或者...

@Author:Runsen

在 Go 语言中没有类(Class)的概念,但这并不意味着 Go 语言不支持面向对象编程,毕竟面向对象只是一种编程思想。对于面向对象编程的支持Go 语言设计得非常简洁而优雅。

下面,我们主要介绍下Go面向对象编程的三大特性:封装、继承和多态。

  • 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式
  • 继承:使得子类具有父类的属性和方法或者重新定义、追加属性和方法等
  • 多态:不同对象中同种行为的不同实现方式

封装

下面代码中我们已经定义了一个矩形 Rectangle,定义一个方法 Area() 来计算它的面积,最后就可以调用 Area() 方法,计算面积。

package main

import (
	"fmt"
)

// 矩形结构体
type Rectangle struct {
	Length int
	Width  int
}

// 计算矩形面积
func (r *Rectangle) Area() int {
	return r.Length * r.Width
}

func main() {
	r := Rectangle{4, 2}
	// 调用 Area() 方法,计算面积
	fmt.Println(r.Area())
}

  
 

在 Go 语言中没有 Java中的public、private、protected 这样的访问控制修饰符,它是通过字母大小写来控制可见性的。这个我在之前说过。

继承

GO语言的继承方式采用的是匿名组合的方式:Woman 结构体中包含匿名字段Person,那么Person中的属性也就属于Woman对象。

package main

import "fmt"

type Person struct { name string
}

type Man struct { Person sex string
}

func main() { man := Man{Person{"Runsen"}, "男"} fmt.Println(man.name) // Runsen fmt.Println(man.sex)  // 男
}

  
 

多态

在面向对象中,多态的特征为:不同对象中同种行为的不同实现方式。在 Go 语言中可以使用接口实现这一特征。接口的概念和Java中的接口一模一样,只不过定义不同,Go使用type 定义接口,Java使用interface 定义接口。

package main

import ( "fmt"
)

// 正方形
type Square struct { side float32
}

// 长方形
type Rectangle struct { length, width float32
}

// 接口 Shaper
type Shaper interface { Area() float32
}

// 计算正方形的面积
func (sq *Square) Area() float32 { return sq.side * sq.side
}

// 计算长方形的面积
func (r *Rectangle) Area() float32 { return r.length * r.width
}
func main() { r := &Rectangle{10, 2} q := &Square{10} // 创建一个 Shaper 类型的数组 shapes := []Shaper{r, q} // 迭代数组上的每一个元素并调用 Area() 方法 for n, _ := range shapes { fmt.Println("图形数据: ", shapes[n]) fmt.Println("它的面积是: ", shapes[n].Area()) }
}

/*
图形数据:  &{10 2}
它的面积是:  20
图形数据:  &{10}
它的面积是:  100
*/

  
 

由以上代码输出结果可知:不同对象调用 Area() 方法产生了不同的结果,展现了多态的特征。

参考资料

  • 官方教程: https://gobyexample.com/
  • 《Go 入门指南》: https://github.com/unknwon/the-way-to-go_ZH_CN

文章来源: maoli.blog.csdn.net,作者:刘润森!,版权归原作者所有,如需转载,请联系作者。

原文链接:maoli.blog.csdn.net/article/details/107961689

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。