这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
什么是多态(是什么)
多态同一个行为具有多个不同表现形式。也就是说一个类实例(对象)的相同方法在不同场景下有不同表现形式。多态机制使内部结构不同的对象可以共享相同的外部接口。
这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。最大的优点就是说可以降低类型之间的耦合度,对吧
在go语言当中多态:用接口实现:某个类型的实例可以赋给它所实现的任意接口类型的变量。类型和接口是松耦合的,并且多重继承可以通过实现多个接口实现。
多态,是指一个类实例的相同方法在不同情形有不同表现形式。
多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
多态的作用(为什么要多态)
知识点引入
- 张三的儿子娶媳妇,通知李五去他家
喝喜酒
(这里就是一个方法
),但是李五有事不能来,李五就让他的三个儿子其中一个代表他老爹李五去喝喜酒
(这里就是一个方法
),使用的是他们老爹的喝喜酒
方法,就像他老爹本人一样。 - 不必编写每一子类的功能调用,可以直接把不同子类当父类看,屏蔽子类间的差异,提高代码的通用率/复用率
- 父类引用可以调用不同子类的功能,提高了代码的扩充性和可维护性
多态的使用(怎么使用)
1.定义接口与类型,让类型去实现接口中的方法
1.定义接口时,方法不能实现
2.一个类型如果实现了接口中的所有方法,我们就说这种类型实现接口,不仅仅结构体,也可以是内置类型
3.自定义类型可以实现多个接口
定义格式
type 接口名 interface {
方法名1(参数列表)(返回值)
方法名2(参数列表)(返回值)
方法名3(参数列表)(返回值)
。。。
}
通过自定义类型来实现接口中的所有方法
//定义类型
type T struct {
}
type TT string
//方法接收者
func (this *T)方法名1()(返回值){}
func (this *T)方法名2()(返回值){}
func (this *T)方法名3()(返回值){}
在main.go
中定义一个结构体一个接口pay
,增加两个方法topay()
,info()
type pay interface {
topay()
info()
}
同时我们来定义一个结构体payment
type payment struct {
paymentmethod string
}
让这个结构体去实现接口pay
中的所有方法
func (this *payment)topay() {
fmt.Println("topay:",this.paymentmethod)
}
func (this *payment)info() {
fmt.Println("info:",this.paymentmethod)
}
我们来定义payment
类型的变量_payment
_payment := &payment{paymentmethod:"alipay"}
这要我们就可以通过这个变量去调用接口中的方法了,因为我们的结构体payment
实现了接口中所有的方法
_payment.info()
_payment.topay()
注意点
一个变量实现了接口当中所有方法,接口就可以指向这个变量
接口内的方法不能实现,体现了程序的多态与低偶合高内聚
var _pay pay
//一个变量实现了接口当中所有方法,接口就可以指向这个变量
_pay = _payment
_pay.info()
_pay.topay()
我们一般不这样使用
,后面我们会讲解他的使用场景