go面向对象方法的调用

go面向对象方法的调用

在面向对象三大特征(封装、继承和多态)里面,go语言只有封装这个功能。但可以使用匿名字段包含,间接实现继承。

type Resouce struct {
	_ uint8
	id int
}

type User struct {
	Resouce //匿名字段,User间接继承自Resource
	name string
}

// 接收者类型为 User 时,可访问方法集全部为 User 的方法,简称 T 方法
// 接收者类型类型 *User 时,可访问方法集为 User 和 *User 的方法,简称 T + *T 方法。
// 接收者类型类型 Manager 包含匿名字段 User,则 Manager 方法集包含 User 方法。
// 接收者类型类型 Manager 包含匿名字段 *User,则 Manager 方法集包含 T + *T 方法。
// 不管嵌入 User 或 *User,*Manager 方法集总是包含 T + *T 方法。

func (self *User) ToString() string {
	return fmt.Sprintf("User = %p, %v", self, self)
}

func (self User) TestValue() {//User拷贝
	fmt.Printf("TestValue: %p, %v\n", &self, self)
}

type Manager struct {
	User//匿名字段
	title string
}

func (self *Manager) ToString() string {
	return fmt.Sprintf("Manager = %p, %v", self, self)
}

func main() {
	m := Manager{User{Resouce{id:1}, "jorn"}, "zhang"}
	fmt.Println(m.ToString())
	fmt.Println(m.User.ToString()) //通过匿名字段,获得和继承类似的利用能力

	//调用方法一:instance.method(args...)
	mInstance := m.ToString()
	m.name = "huangbin"
	fmt.Println(mInstance)
	fmt.Println(m.ToString())

	//调用方法二:<type>.func(instance, args...)
	mFunc := (*User).ToString
	fmt.Println(mFunc(&m.User))

	mFunc2 := (User).TestValue
	mFunc2(m.User)
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页