Go物件導向程式設計OOP的實現

sdccone1發表於2020-12-01
  • 在go 中 在函式名前加上一個宣告(Type *Type)表明該方法是屬於哪個物件(Type),以此來實現OOP,且特別注意,在go中因為沒有繼承的概念,所以只能使用組合這種方式來實現程式碼複用
  • func (Type *Type) func_Name(args) (return list){}
package demo
/*
@Author:David Ma
@Content:go中的物件導向程式設計(oop)的實現,以及型別別名和組合在使用時的區別
@Date:202-12-01 15:41
*/
import (
	"fmt"
)

type Person struct {
	Name string
}

// 型別別名
type Student2 Person

//型別組合
type Student1 struct {
	Person
	SID int
}

// go中oop的實現,在函式名前加上一個宣告(Type *Type)表明該方法是屬於哪個物件(Type)
func (p *Person) WakeUp(){
	fmt.Printf("%s waking up\n", p.Name)
}

func (p *Person) Eat(){
	fmt.Printf("%s eating\n", p.Name)
}

func (p *Person) Sleep(){
	fmt.Printf("%s sleeping\n", p.Name)
}

func (s *Student1) Study(){
	fmt.Printf("%s learning\n", s.Name)
}

func (s *Student2) Study(){
	fmt.Printf("%s learning\n", s.Name)
}

func (s *Student1) Student1Daily() {
	s.WakeUp()
	s.Eat()
	s.Study()
	s.Sleep()
}

//雖然說型別別名沒有建立新型別,只是換了個名字起了個小名,但是在OOP中,無法利用型別別名來實現程式碼複用,只能利用組合來實現程式碼複用
//func (s *Student2) Student2Daily() {
//	s.WakeUp() // compile error:Unresolved reference 'WakeUp'
//	s.Eat()  // compile error:Unresolved reference 'WakeUp'
//	s.Study()
//	s.Sleep() // compile error:Unresolved reference 'WakeUp'
//}

相關文章