go语言的魔幻旅程12-面向对象

309 阅读3分钟

宜将剩勇追穷寇,不可沽名学霸王

70多年前,正值蒋家王朝覆灭前夜,革命领袖毛教员大手一挥,打过长江去,彻底结束蒋家王朝在中国大地的统治。兴之所至,大笔一挥:宜将剩勇追穷寇,不可沽名学霸王。诗词本意大致如下:千万不能向西楚霸王一样为了贪图虚名而放走敌人,最终导致失败。前事不忘后事之师,教训古而有之,历史王朝的更迭命运如此,个人编程语言的学习亦如此,有的人在学习的过程中总以为掌握个差不多就行,殊不知好的工程师不仅主干知识掌握扎实,边缘知识同样重视。


go语言中的面向对象

go语言作为一门全新的语言,从某种程度上来讲既可以说是一门支持面向对象的编程语言,也可以说是一门不支持面向对象的语言,之所以可以说是支持面向对象的编程语言是因为go可以实现面向对象的继承、封装、多态的语言属性;不支持是go的面向对象的语言特征不像go语言那般纯正。go的官方的说法是这样的:“可以说是,也可以说不是。虽然 Go 有类型和方法,支持面向对象的编程风格,但却没有类型的层次结构。Go 中的“接口”概念提供了一种不同的方法,我们认为它易于使用,也更为普遍。Go 也可以将结构体嵌套使用,这与子类化(Subclassing)类似,但并不完全相同。此外,Go 提供的特性比 C++ 或 Java 更为通用:子类可以由任何类型的数据来定义,甚至是内建类型(如简单的“未装箱的”整型)。这在结构体(类)中没有受到限制”。

1、go中的对象和构造方法

go语言中不存在面向对象语言中的类,却采用了结构体来代替类,同样也没有面向对象语言的构造方法,却同样的可以采取某种方式来实现构造方法的效果

//举个栗子,结构体Employee相当于面向对象语言中的对象
type Employee struct {  
    FirstName   string
    LastName    string
    TotalLeaves int
    LeavesTaken int
}

//构造方法的实现
func New(firstName string, lastName string, totalLeave int, leavesTaken int) employee {  
    e := employee {firstName, lastName, totalLeave, leavesTaken}
    return e
}

func main() {  
    e := employee.New("Sam", "Adolf", 30, 20)
    e.LeavesRemaining()
}

2、面向对象的封装

go语言的封装本质上和其他的编程语言没有什么区别,只不过大部分的情形下go语言的封装是借助方法来实现的

//举个栗子
type Person struct {
    name string }

func (person *Person) setName(name string) {
    person.name = name
}

func (person *Person) GetInfo() {
    fmt.Println(person.name)
}

func main() {
    p := Person{"zhangsan"}
    p.setName("lisi")
    p.GetInfo()
}

3、面向对象的继承

go语言形式上形式上是不支持面向对象的语言的,但是可以通过组合的方式来实现相同功能,也就是说go中继承的实现主要是依靠结构体对象之间的嵌套来实现的。

//举个栗子
type Person struct {
    name string }

type Woman struct {
    Person
    sex string }

func main() {
    woman := Woman{Person{"wangwu"}, "女"}
    fmt.Println(woman.name)
    fmt.Println(woman.sex)
}

4、面向对象的多态

多态的概念可能相对于封装、继承理解上存在一定的难点,简单而言多态就是就是针对同一个事物具有不同的表现形式

//举个栗子
 type Eater interface {
    Eat()
}

type Man struct {
}

type Woman struct {
}

func (man *Man) Eat() {
    fmt.Println("Man Eat")
}

func (woman *Woman) Eat() {
    fmt.Println("Woman Eat")
}

func main() {
    var e Eater
    woman := Woman{}
    man := Man{}
    e = &woman
    e.Eat()
    e = &man
    e.Eat()
}

总结

go语言的面向对象虽然没有传统面向对象编程语言那样的血统纯正,但是也相对更加的灵活,使用上虽然相对其他的语言有所区别,但是总体而言不是非常的难以理解,因此这部分的内容还是需要下点功夫真正掌握的。