所谓万物皆可对象,面向对象编程(oop)是一个很重要的编程思想,面向对象的核心:继承、多态;但go跟c++不一样,go没有c++的class,也没有继承的关键字,但是go依然可以实现oop。
以下通过一个简单例子来展示go语言中的面向对象。
继承
go中没有class,对于继承也没有任何关键字,但是go有type关键字,并且有struct,我们可用struct定义自己需要的类型,以下定义了三个struct,并且希望有一个父类Animal,两个子类Cat和Dog,如下:
type Animal struct {
Name string
mean bool
}
type Cat struct {
Basics Animal
MeowStrength int
}
type Dog struct {
Animal
BarkStrength int
}
在Cat和Dog中,都定义了Animal类型,Cat中定义了一个名为Basic的Animal类型,Dog中没有定义变量类型,这两种方式都可以,取决于个人习惯。
接着我们可以为各自的类实现他们的函数:
func (dog *Dog) MakeNoise() {
barkStrength := dog.BarkStrength
if dog.mean == true {
barkStrength = barkStrength * 5
}
for bark := 0; bark < barkStrength; bark++ {
fmt.Printf("BARK ")
}
fmt.Println("")
}
func (cat *Cat) MakeNoise() {
meowStrength := cat.MeowStrength
if cat.Basics.mean == true {
meowStrength = meowStrength * 5
}
for meow := 0; meow < meowStrength; meow++ {
fmt.Printf("MEOW ")
}
fmt.Println("")
}
多态
继承搞定了,我们看下go语言中的多态如何实现。go为我们提供了一个interface类型,我们可以借助interface来实现多态,如下:
type AnimalSounder interface {
MakeNoise()
}
func MakeSomeNoise(animalSounder AnimalSounder) {
animalSounder.MakeNoise()
}
我们将AnimalSounder定义为一个interface类型,AnimalSounder中包含了一个MakeNoise()函数。
在上一步中,Dog和Cat都实现了MakeNoise这个函数,那么我们就认为Dog和Cat都实现了AnimalSounder这个接口。
此外我们还定义了一个MakeSomeNoise函数,我们通过MakeSomeNoise实现了多态,入参就是接口。接着我们只需要对Cat和Dog做初始化,接着将初始化的对象作为参数传入MakeSomeNoise,即可实现多态,声明如下:
func main() {
myDog := &Dog{
Animal{
"Rover", // Name
false, // mean
},
2, // BarkStrength
}
myCat := &Cat{
Basics: Animal{
Name: "Julius",
mean: true,
},
MeowStrength: 3,
}
MakeSomeNoise(myDog)
MakeSomeNoise(myCat)
}
完整代码:
package main
import (
"fmt"
)
type Animal struct {
Name string
mean bool
}
type AnimalSounder interface {
MakeNoise()
}
type Dog struct {
Animal
BarkStrength int
}
type Cat struct {
Basics Animal
MeowStrength int
}
func main() {
myDog := &Dog{
Animal{
"Rover", // Name
false, // mean
},
2, // BarkStrength
}
myCat := &Cat{
Basics: Animal{
Name: "Julius",
mean: true,
},
MeowStrength: 3,
}
MakeSomeNoise(myDog)
MakeSomeNoise(myCat)
}
func (dog *Dog) MakeNoise() {
barkStrength := dog.BarkStrength
if dog.mean == true {
barkStrength = barkStrength * 5
}
for bark := 0; bark < barkStrength; bark++ {
fmt.Printf("BARK ")
}
fmt.Println("")
}
func (cat *Cat) MakeNoise() {
meowStrength := cat.MeowStrength
if cat.Basics.mean == true {
meowStrength = meowStrength * 5
}
for meow := 0; meow < meowStrength; meow++ {
fmt.Printf("MEOW ")
}
fmt.Println("")
}
func MakeSomeNoise(animalSounder AnimalSounder) {
animalSounder.MakeNoise()
}
参考:
https://www.ardanlabs.com/blog/2013/07/object-oriented-programming-in-go.html