面向对象的三大特性
面向对象编程中的三大特性指的是:继承、多态和封装。多态是基于接口实现的。
- 继承
- 封装
- 接口
- 多态
当我们定义一个结构体的时候,实际上就是把一类事物的共有属性(字段)和行为(方法)提取出来,形成一个物理模型,这种研究问题的方法就是抽象。
银行存取款
1 | package main |
继承
继承入门
继承可以解决代码复用,当结构体中存在相同的属性和方法时,可以从这些结构体中抽象出结构体,其他的结构体中不需要重新定义这些相同的属性和方法。
如果一个结构体中嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。
1 | type Goods struct{ |
1 | // 关于学生的继承栗子 |
继承深入
- 结构体可以使用匿名结构体的所有字段,包含大写和小写都可以
- 匿名结构体字段访问可以简化
- 如果结构体和匿名结构体中含有相同字段,编译器采用的是就近访问原则;如果需要希望访问匿名结构体的字段和方法,可以通过匿名结构体名来进行区分
- 结构体中嵌入两个或者多个匿名结构体,如果两个结构体中有相同的字段或者方法(同时结构体本身没有同名的字段或者方法),在访问的时候,必须指明匿名结构体名字,否则编译报错。
- 如果结构体中嵌套了有名结构体,这种模式就是组合,此时访问结构体中的字段或者属性,必须带上结构体的名字。
1 | package main |
封装encapsulation
把抽象的字段和对字段的操作封装在一起,数据被保护在内部。程序的其他包只能通过被授权的方式才能对其进行操作。电视机的操作就是典型的封装
- 隐藏实现细节
- 可以对数据进行验证,保证安全合理
- 对结构体的属性进行封装
- 通过方法和包等实现封装
1 | // model/person.go |
1 | // main/main.go |
接口interface
简介
接口是一种抽象的类型,基于方法实现的。interface
是一组method
的集合。接口做的事情就像是定义了一个协议(规则)。高内聚低耦合特性。接口是引用类型
Go语言提倡面向接口编程。每个接口由数个方法组成,接口的定义格式如下:
1 | type 接口类型名 interface{ |
其中:
- 接口名:使用
type
将接口定义为自定义的类型名。Go语言的接口在命名时,一般会在单词后面添加er
,如有写操作的接口叫Writer
,有字符串功能的接口叫Stringer
等。接口名最好要能突出该接口的类型含义。 - 方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。
- 参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。
举个例子:
1 | type writer interface{ |
1 | package main |
注意事项和细节
- 接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量
- 一个自定义类型需要实现接口中全部的方法
- 只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型
- 一个自定义类型可以实现多个接口
- 接口之间可以存在继承关系
interface
默认是一个指针(引用类型)- 空接口没有任何方法,所有类型都实现了空接口,可以把任何一个变量赋值给空接口。
1 | package main |
1 | package main |
结构体切片排序
1 | package main |
接口和继承关系
当结构体需要扩展功能,同时不破坏继承关系,可以使用接口去实现。接口是对继承的一个补充
继承:解决代码的复用性和可维护性
接口:设计好各种规范,让其他自定义类型去实现这些方法;接口在一定程度上能实现代码解藕。
1 | package main |
多态poly
变量具有多种形态,多态特征是通过接口来实现的。
- 多态参数:
usb
就是多态参数 - 多态数组:
1 | package main |