Golang 入門系列(四)淺談Go語言中的面向對象

前面介紹了Golang的重要特性:Interface接口。不清楚的同學一定要把這個概念搞懂,或者看看我之前的文章:

大家都知道 golang 語法中主要的是結構體和函數,並沒有類的概念,那麼如果想讓golang搞一搞面向對象編程該怎麼實現呢?

下面就圍繞著 封裝、繼承、多態和抽象這4個面向對象編程的基本特徵說一說Golang語言是如何實現面向對象編程。


GO語言中的面向對象

其實GO並不是一個純面向對象編程語言。它沒有提供類(class)這個關鍵字,只提供了結構體(struct)類型。

java或者C# 裡面,結構體(struct)是不能有成員函數的。然而,Go語言中的結構體(struct)可以有"成員函數"。方法可以被添加到結構體中,類似於類的實現。

所以,我個人覺得Go 語言在的面向對象其實更簡單,也更容易理解。

如何實現面向對象

學過java或C# 的人應該都知道,面向對象的三個基本特徵:封裝、繼承和多態。他們的定義我這裡就不細說了。下面,就直接看看 go 語言下的面向對象是怎樣實現的吧。

1. 封裝特性

Golang區分公有屬性和私有屬性的機制就是方法或屬性是否首字母大寫,如果方法的首字母是大寫的說明是公有方法,可以被其他方法調用,如果首字母小寫則是私有方法,不能被調用。

下面我們定義一個Person類型如下:

<code>package main

import "fmt"

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()
}/<code>

2. 繼承特性

GO語言的繼承方式採用的是匿名組合的方式:Woman 結構體中包含匿名字段Person,那麼Person中的屬性也就屬於Woman對象。

<code>package main

import "fmt"

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

  

3. 多態特性

基類指針可以指向任意派生類的對象,並在運行時綁定最終調用的方法的過程被稱為多態。多態是運行時特性,而繼承則是編譯時特徵,也就是說,繼承關係在編譯時就已經確定了,而多態則可以實現運行時的動態綁定。

下面這個例子:Woman和Man都是實現了吃東西的行為。所以,我們可以把它們共同的方法提煉出來定義一個抽象的Eater 接口:

<code>package main

import "fmt"

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()
}/<code>

最後

以上,就把Go語言如何實現面向對象的簡單介紹了一下,其實跟java和C# 等也都差不多,大家可以比較著來看。總結的來說就是:Go沒有類,而是松耦合的類型、方法對接口的實現。



分享到:


相關文章: