2020-01-08 Go语言学习日记:面向对象编程

面向对象编程

  • 封装:通过方法实现
  • 继承:通过匿名字段实现
  • 多态:通过接口实现

匿名字段组合

type Person struct {
	id int
}
type Student struct {
	Person //结构体匿名字段,只有结构名。默认包含了Person字段的所有成员
	name string
}

初始化

//顺序初始化
var student1 Student = Student{Person{1}, "H"}
//自动推导类型
student2 := Student{Person{1}, "H"}
//指定成员初始化
student3 := Student{Person: Person{id: 1}}

成员操作

student1.id = 2 //直接通过匿名字段中的成员变量名来调用
student1.name = "Z"
//也可以整体赋值
student1.Person = {3}

方法继承

//这里增加一段Person结构的方法
func (p Person) PrintInfo()  {
	fmt.Printf("id = %d \n", p.id)
}
//main中声明的Student是可以调用Person中的方法的
func main()  {
	student := Student{Person{1}, "a"}
	student.PrintInfo()
}

方法重写

  • 子类写了同名方法
  • 当方法重写后首先调用子类方法(就近原则)
  • 也可以显式调用父类方法。例如:student.Person.PrintInfo()

方法

绑定特殊字段的函数;
和特殊类型关联的函数;

  • go语言中可以给任意自定义类型(包括内置类型,但不包括指针类型)添加相应的方法
  • 方法总是绑定对象实例,并隐式将实例作为第一实参,方法的语法如下:
    func (receiver ReceiverType) funcName(parameters) (results)
  • 参数receiver可以任意命名,若方法中未曾使用,可以省略参数名
  • ReceiverType可以是普通类型也可以是指针类型。但基类型不能是接口或指针
  • 不支持方法重载
//修改自己的变量在函数中修改会影响到函数外
func (student Student) ChangeName(newName string)  {
	student.name = newName
}

调用

//通过:(接收返回参数 =) 变量名.方法名(传入参数)   来调用
student1.ChangeName("H")

值语义和引用语义

  • 接收者为指针变量时为引用语义
  • 接收者为普通变量时为值语义

指针变量和普通的方法集

当结构体变量是一个指针变量时,它能够调用的方法称为方法集
声明的变量都可以同时调用值语义和引用语义的方法

方法值

方法变量名 := 变量名.方法

  • 隐藏了接收者
  • 使用一个变量名来保存方法调用。例如:
sFunc := student.PrintInfo
sFunc(传入参数)

方法表达式

方法变量名 := 类型.方法

  • 接收者用结构来表示
  • 使用一个变量名来保存方法调用。例如:
sFunc := Person.PrintInfo
sFunc := (*Pserson).PrintInfo
sFunc(student.Person(需要设定哪个成员调用该方法), ...传入参数)
sFunc((&student).Person(需要设定哪个成员调用该方法), ...传入参数)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值