手记

如何在 Golang 中实现面向对象

首先 Golang 中没有对象的概念,但基于现有的语法是可以写出面向对象的代码。

另外面向对象是一种编程思想, 并不局限于编程语言本身

那么 talk is cheap show me the code 让我们看看 Golang 中的 面向对象 怎么玩转 加减运算

回顾结构体

type Add struct {
	Num1 int
	Num2 int
}

以上代码用 结构体 表示了 算法中加法,用面向对象的思维来理解,Num1Num2是两个成员变量。那么,我们就应该思考,如何编写成员方法呢?

type Add struct {
	Num1 int
	Num2 int
}

func ( add *Add ) Operation() int {
	return add.Num1 + add.Num2
}

在关键字func和函数名之间加上一对小括号,写上与之关联的结构体类型的指针类型和变量名,推荐写成指针类型的原因是,函数传递的形参不是指针类型的话,无法覆盖实参。

实际上,此时 Operation() 就可以叫做成员方法了

继承

其他面向对象的语言,是使用extends关键字来表示继承的,而 go 语言中继承的设计非常简单,不需要额外的关键字。

type BaseNum struct {
	Num1 int
	Num2 int
}


// 加法
type Add struct {
	BaseNum
}

func ( add *Add ) Operation() int {
	return add.Num1 + add.Num2
}


// 减法
type Sub struct {
	BaseNum
}

func ( sub *Sub ) Operation() int {
	return sub.Num1 - sub.Num2
}

可以看到,在 Add 结构体中,我们使用到了 BaseNum 作为匿名变量

意思就是:Add 继承自 BaseNum。我们除了继承了成员变量和成员方法之外,还可以为 Add 结构体增加成员方法,重写成员方法。

接口

type Operation interface {
	Operation() int
}


凡对象成员方法中,实现 Operation() 成员函数,皆视为继承 Operation 接口

多态

type BaseNum struct {
	Num1 int
	Num2 int
}

// 运算接口
type Operation interface {
	Operation() int
}

// 加法
type Add struct {
	BaseNum
}

func ( add *Add ) Operation() int {
	return add.Num1 + add.Num2
}

func main() {
	addOperation := Add{ BaseNum{ 1, 2 } }

	var operation Operation		// 声明接口
	operation = &addOperation	// 使用多态

	result := operation.Operation()
	fmt.Println( result )
}

以上就是 面向对象 中 封装继承多态 在 Golang 中的应用,希望对您有所得益

2人推荐
随时随地看视频
慕课网APP