面向对象OOP,注重重用
面向过程OPP
一。传统面向对象类与类的关系:(go为struct)
- 继承:is-a ,强耦合
- 实现 : like-a
- 依赖: use-a,一般作为方法参数
- 关联:has-a,强依赖,平等。
- 聚合:has-a,整体与部分,拥有。可拆分
- 组合:contains-a,强聚合,不可拆分
- 组合>聚合> 关联> 依赖
继承有多种实现方式,(1)强耦合(关键字继承)(2)松耦合(组合式)。一般组合式更好
接口命名习惯以er结尾
一、go语言面向对象
封装:方法(带有接收者的函数,自带参数)(首字母大小写控制访问权限。属性首字母小写,对外提供访问方法)
继承:通过组合(匿名字段/属性,结构体)实现。代码复用。
type Teacher struct{
People //匿名属性实现继承
class string
}
多态:基于接口的多态,接口作为方法的参数。结构体赋给接口
go语言中,可以给除了指针类型以外的自定义类型(包括内置类型)添加相应的方法
方法的receiver类型可以是T(不能是接口或指针)或*T
不支持重载方法(名字相同,参数不同)
receiver类型不同就是不同的方法
方法的receiver为普通类型时,为值传递。 指针类型时,为引用传递
Person结构体的方法:
func (tmp Person) Print(){
...
结构体本身为值类型
结构体指针:new(Person) 或&Person{}。结构体指针取值Person
}
1. 方法的重写
方法名相同,接收者不同
默认时按就近原则调用。也可以指定调用
2. 方法表达式
f=(Person).SetInfo
f(p) //普通变量作为接收者(p Person)
通过结构体变量调用。
接收者传指针类型,可以修改接收者变量的值
3. (接口)超集(变量)可以转换(/赋值)为子集,反之不可以。
属于关系
type Live interface{
run()
}
func a(*People) run(){
fmt.Println("人在跑步")
}
func allRun(live Live){
live.run()
}
func main(){
peo:=&People{}
allRun(peo)
}
4. 类型断言 for...range
- if value,ok := data.(int);ok==true{
...
} - switch v :=data.(type){
...
}
网友评论