1. 对象
- 任意简单的内置数据类型
- 任意复杂的结构体
- 表示具体的事物 / 抽象的规则 / 计划 / 事件 等.
2. 对象的状态
- 用数值来描述, 如长方体的长和宽等.
3. 对象的操作
- 用于改变对象的状态, 操作就是对象的行为.
- GO语言中称为Method(方法), Method 就是在 函数(function) 前面增加了一个接收者(Receiver)对象. 将操作和对象关联起来了.
- 定义: func (recv receiver_type) methodName(args)(rets){} Receiver 可以是: 内置类型/自定义类型/结构体/指针类型
- 多个Method可以同名, 只要接收者不同, 就是不同的Method.(类似于重载吧)
- Method可以访问接收者的字段, 而不需要将字段作为参数传入Method, 就像在struct中访问字段一样.
- 普通类型作为Receiver,是值传递; 指针类型作为Receiver, 将传递引用.
package main import ( "fmt" "math" ) type rect struct { width int height int } type circle struct { radius float32 } func (recv rect) area() int { return recv.width * recv.height } func (recv circle) area() float32 { return recv.radius * recv.radius * math.Pi } func main() { r1 := rect{4, 3} r2 := rect{30, 15} fmt.Println(r1.area(), r2.area()) c := circle{5} fmt.Println(c.area()) }
- Receiver
- 匿名Receiver, 省略了receiver的名字(类型没有省,所以可以判断), 此时不能定义同名的方法(应该是会造成无法将操作和对象绑定).
- Method 继承
- go中可以通过匿名字段实现字段继承; 如果匿名字段实现了一个Method(或者说是这个Method的Receiver), 那么包含这个匿名字段的struct对象也能调用该Method.
- 可以重写继承的方法, 对象会像处理匿名字段一样, 优先处理外部同名Method.
时间: 2024-12-14 14:49:41