1、封装
封装实现的步骤:
2、继承
== 问题:== 出现代码冗余,而且代码不利于维护,同时也不利于功能的扩展
通过继承解决代码复用问题,即当多个结构体存在相同的属性(字段)和方法时,可以从多个结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法。
嵌套匿名结构体的基本语法
type Goods struct{
Name string
Price float64
}
type Book struct{
Goods //此处嵌套匿名结构体Goods
Writer string
}
结构体中嵌入两个(或多个)匿名结构体,如果两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,必须明确指定匿名结构体的名字,否则会报错。
多继承
一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现多重继承。
3、接口
多态特性主要通过接口来实现
interface接口可以定义一组方法,但是不需要实现,并且interface不能包含任何变量。一个接口定义了一套方法,若一个具体类型要实现该接口,必须实现接口类型定义中所有方法。
说明:
- 接口中所有方法都没有方法体,即接口中方法都是没有实现的方法。接口体现了程序设计的多态和高内聚低耦合的思想。
- golang中接口,不需要显示的实现,只要一个变量,含有接口类型中所有方法,那么这个变量就实现了这个接口。golang中没有__implement__这个关键字。
注意事项和细节:
1、 接口本身 不能创建实例 ,但是可以指向实现了该接口的自定义类型的变量(实例)
7、Golang接口中不能有任何变量
8、一个接口(如接口A)可以继承多个别的接口(如接口B、C),如果要实现A接口,也必须将B、C接口的方法全部实现。
9、interface类型默认是一个指针(引用类型),如果没有对interface进行初始化就使用,那么会输出nil。
10、空接口interface{},没有任何方法,所以所有类型都实现了空接口,可以将任何一个变量赋给空接口。★★★
注意:
接口和继承
1、当A结构体继承了B结构体,那么A就自动继承了B的字段和方法,并且可以直接使用
2、当A结构体需要扩展某些功能时,同时不希望破坏继承关系,可以去实现某个接口即可——接口是对继承的补充
继承::解决代码的复用性和可维护性
接口:设计,设计好各种规范(方法), 让其自定义类型去实现这些方法
接口在一定程度上实现代码解耦
4、多态
多态特性主要通过接口来实现,可以按照统一的接口来调用不同的实现,这时接口就呈现不同的形态。
接口实现多态的两种形式:
1、多态参数
在一个接口中,只要这类型参数实现了接口中方法,就可以被这个接口接受,体现接口多态
2、多态数组
接口数组中可以存放多种结构体,只要结构体实现了接口中方法。