golang - 面向对象多态

876 阅读3分钟

这是我参与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()

我们一般不这样使用,后面我们会讲解他的使用场景