如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人博客
前言
Golang语言内虽然没有明确的面向对象概念
,但中华儿女多奇志,基于已有的struct
结构体,我们也能实现面向对象的代码。
重温结构体
type BaseNum struct {
Num1 int
Num2 int
}
这里有一个 BaseNum
的结构体,代表要进行数学运算的两个数的集合
,分别有 Num1
、 Num2
成员变量标记。
给结构体添加方法
func (baseNum *BaseNum) setNum1(num int) {
baseNum.Num1 = num
}
func (baseNum *BaseNum) setNum2(num int) {
baseNum.Num2 = num
}
func (num *BaseNum) add() {
fmt.Printf("result: %d\n", num.Num1 + num.Num2)
}
方法是对特定类型进行操作的函数。func
跟着的 (baseNum *BaseNum)
就是指定方法从属的对象。
而*BaseNum
带有的*
指其应用原实例的 BaseNum 结构体地址进行成员变量操作
继承
在结构体内嵌入另一个结构体,被嵌入的结构体
就继承了 嵌入的结构体
提供属性和方法。比如:
我们现在定义两数集合结构体BaseNum
,是专门给加法用的。我们可以这么写
type AddNum struct {
BaseNum
}
func ( addNum *AddNum ) Operation() int {
addNum.add()
return addNum.Num1 + addNum.Num2
}
重写
子类(结构体)中的方法,与父类中的方法名称重复
,等于将父类中相同名称方法
的功能给重写,比如还是刚才的例子:
type AddNum struct {
BaseNum
}
func ( addNum *AddNum ) Operation() int {
addNum.add()
return addNum.Num1 + addNum.Num2
}
func ( addNum *AddNum ) add() int {
return addNum.Num1 + addNum.Num2
}
func main() {
addNum := AddNum{BaseNum{Num1:3,Num2:4}}
ret1 := addNum.add()
fmt.Println(ret1) // 7
}
完整代码
package main
import "fmt"
type BaseNum struct {
Num1 int
Num2 int
}
func (baseNum *BaseNum) setNum1(num int) {
baseNum.Num1 = num
}
func (baseNum *BaseNum) setNum2(num int) {
baseNum.Num2 = num
}
func (num *BaseNum) add() {
fmt.Printf("result: %d\n", num.Num1 + num.Num2)
}
type AddNum struct {
BaseNum
}
func ( addNum *AddNum ) Operation() int {
addNum.add()
return addNum.Num1 + addNum.Num2
}
func ( addNum *AddNum ) add() int {
return addNum.Num1 + addNum.Num2
}
func main() {
// v1
num := BaseNum{}
num.setNum1(1)
num.setNum2(2)
num.add()
// v2
addNum := AddNum{BaseNum{Num1:3,Num2:4}}
addNum.Operation()
ret1 := addNum.add()
fmt.Println(ret1)
}