Go 面向对象方法、继承、多态实现代码示例

Go 语言对数据和方法的封装是一种分离式的封装

由于在go语言中没有class关键字,因此没有类的方式对数据(属性)和方法进行封装
1、通过struct完成属性的封装
2、方法与结构体进行绑定

package main

import (
	"fmt"
)

//创建结构体,并声明属性
type Person struct {
	name string
}

//将Person结构体与Say方法进行绑定
func (p *Person) Say(content string) string {
	return content
}

func (p *Person) SetName(name string) {
	p.name = name
}

func (p *Person) GetName() string {
	return p.name
}

func main() {
	p := Person{"xiangming"}
	fmt.Println(p.Say("Hello sa"))

	p.SetName("zhangshan")
	fmt.Println(p.GetName())

}

Go 完成封装后是如何对属性和方法的可访问性进行控制的

D:\go_work\src\helloworld\main.go

package main

import (
	"fmt"
	"helloworld/person"
)

func main() {

	p := new(person.Person)
	p.SetName("coding")
	fmt.Println(p.Say("Hello Conding"),p.GetName())
}

D:\go_work\src\helloworld\person\person.go

package person

//创建结构体,并声明属性
type Person struct {
	name string
	age  int
}

//将结构体与方法进行绑定
func (p *Person) Say(content string) string {
	return content
}

func (p *Person) SetAge(age int) {
	p.age = age
}

func (p *Person) SetName(name string) {
	p.name = name
}

func (p *Person) GetAge() int {
	return p.age
}

func (p *Person) GetName() string {
	return p.name
}

Go 实现继承和方法的覆写

Go 实现继承时不用 interface,它其实也不是真正的继承
D:\go_work\src\helloworld\main.go

package main

import (
	"fmt"
	"helloworld/person"
)

func main() {

	p := new(person.Person)
	p.SetName("coding")

	w := new(person.Worker)
	w.SetName("worker")
	w.Company = "测试"
	
	//&{coding 0}
	fmt.Println(p)
	//&{{worker 0} 测试} 第二个花括号表示从Person中继承的内容
	fmt.Println(w)


	//Hi
	fmt.Println(p.Say("Hi"))
	//测试:Hi
	fmt.Println(w.Say("Hi"))
}

D:\go_work\src\helloworld\person\person.go

package person

//创建结构体,并声明属性
type Person struct {
	name string
	age  int
}

//将结构体与方法进行绑定
func (p *Person) Say(content string) string {
	return content
}

func (p *Person) SetName(name string) {
	p.name = name
}

func (p *Person) GetName() string {
	return p.name
}

D:\go_work\src\helloworld\person\worker.go

package person

// 继承Person
type Worker struct {
	Person
	Company string
}

//将结构体与方法进行绑定
//覆写Person方法Say
func (w *Worker) Say(content string) string {
	return w.Company + ":" + content
}

Go 多态

D:\go_work\src\helloworld\main.go

package main

import (
	"fmt"
	"helloworld/person"
)

func say(base person.PersonBehavior) {
	fmt.Println(base.Say("Hi"))
}

func main() {

	p := new(person.Person)
	p.SetName("coding")

	w := new(person.Worker)
	w.SetName("worker")
	w.Company = "测试"

	s := new(person.Student)
	s.SetName("worker")

	say(p)
	say(w)
	say(s)
}

基类
D:\go_work\src\helloworld\person\person.go

package person

type PersonBehavior interface {
	Say(content string) string
}

//创建结构体,并声明属性
type Person struct {
	PersonBehavior
	name string
}

//将结构体与方法进行绑定
func (p *Person) Say(content string) string {
	return content
}

func (p *Person) SetName(name string) {
	p.name = name
}

func (p *Person) GetName() string {
	return p.name
}

D:\go_work\src\helloworld\person\worker.go

package person

// 继承Person
type Worker struct {
	Person
	Company string
}

//将结构体与方法进行绑定
//覆写Person方法Say
func (w *Worker) Say(content string) string {
	return w.Company + ":" + content
}

D:\go_work\src\helloworld\person\student.go

package person

type Student struct {
	Person
	School string
}

// 覆写 Person方法
func (s *Student) Say(content string) string {
	return "学生:" + content
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值