golang 面向对象

golang 面向对象

Posted by 锐玩道 on May 21, 2021

如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人博客

前言

Golang语言内虽然没有明确的面向对象概念,但中华儿女多奇志,基于已有的struct结构体,我们也能实现面向对象的代码。

重温结构体

type BaseNum struct {
	Num1 int
	Num2 int
}

这里有一个 BaseNum 的结构体,代表要进行数学运算的两个数的集合,分别有 Num1Num2 成员变量标记。

给结构体添加方法

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)
}