您的位置:首页 > 编程语言 > Go语言

Go语言学习 面向对象

2017-10-09 20:24 489 查看
首先,我们先来看一段代码示例

package main

import "fmt"

type Human struct {
name string
age int
phone string
}

type Student struct {
Human //匿名字段
school string
loan float32
}

type Employee struct {
Human //匿名字段
company string
money float32
}

//Human实现SayHi方法
func (h Human) SayHi() {
fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}

//Human实现Sing方法
func (h Human) Sing(lyrics string) {
fmt.Println("La la la la...", lyrics)
}

//Employee重载Human的SayHi方法
func (e Employee) SayHi() {
fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,
e.company, e.phone)
}

// Interface Men被Human,Student和Employee实现
// 因为这三个类型都实现了这两个方法
type Men interface {
SayHi()
Sing(lyrics string)
}

func main() {
mike := Student{Human{"Mike", 25, "222-222-XXX"}, "MIT", 0.00}
paul := Student{Human{"Paul", 26, "111-222-XXX"}, "Harvard", 100}
sam := Employee{Human{"Sam", 36, "444-222-XXX"}, "Golang Inc.", 1000}
tom := Employee{Human{"Tom", 37, "222-444-XXX"}, "Things Ltd.", 5000}

//定义Men类型的变量i
var i Men

//i能存储Student
i = mike
fmt.Println("This is Mike, a Student:")
i.SayHi()
i.Sing("November rain")

//i也能存储Employee
i = tom
fmt.Println("This is tom, an Employee:")
i.SayHi()
i.Sing("Born to be wild")

//定义了slice Men
fmt.Println("Let's use a slice of Men and see what happens")
x := make([]Men, 3)
//这三个都是不同类型的元素,但是他们实现了interface同一个接口
x[0], x[1], x[2] = paul, sam, mike

for _, value := range x{
value.SayHi()
}
}


在这段代码示例中,我们定义了五个“类”(Go语言中没有类这个说法,但是类似于C++中的类):Human、Student、Employee。每个类都包含特定的字段。而Human则是匿名字段,默认包含了Human的所有字段。

Men是个接口(interface),包含了SayHi、Sing两个方法,它能保存所有有这两个方法的对象。就像很经典的“鸭子理论”:如果一只鸟跑起来像鸭子、走起啦像鸭子、叫起来像鸭子,那么它就是一只鸭子。鸭子是接口,我们不用管它是白鸭子还是黑鸭子,虽然他们跑的动作可能有些不同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息