七、Go 语言面向对象编程
【摘要】 @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)