所谓多态就是子类在继承了父类后,自己重新写了一个方法覆盖父类的同名方法。继续引用上文的案例,父类computer中有PowerOff方法,但是子类laptop把盖子合上也可以认为是一种PowerOff。所以laptop类重新实现的PowerOff就是类的多态的实现。在Python中的实现如下:

class Computer:
def __init__(self, computer_type):
# 描述基础属性 电脑类型
self.computer_type = computer_type

def PowerOn(self):
print("{} 开机".format(self.computer_type))

def PowerOff(self):
print("{} 关机".format(self.computer_type))


class Laptop(Computer):
# 声明实例化这个类时需要带入的参数
def __init__(self, computer_size, computer_type):
# 填充父类所需的属性
Computer.__init__(self, computer_type)
# 声明子类特有的属性
self.computer_size = computer_size

def move(self):
print("{} 寸的电脑被拿走了".format(self.computer_size))

# 重新实现一个PowerOff方法,覆盖父类的同名方法
def PowerOff(self):
print("{} 被合上了盖子".format(self.computer_type))

def ComputerPowerOff(self):
# 通过super还可以调用父类的方法
super().PowerOff()


# 实例化子类并根据声明将父类和子类所需的参数一并传入
lap = Laptop(14, "laptop")

# 在子类中可以调用父类的PowerOff方法
lap.ComputerPowerOff()
# 在子类中调用自己的PowerOff方法
lap.PowerOff()

运行结果

% python main.py
laptop 关机
laptop 被合上了盖子

在Go的实现代码如下:

package main

import "fmt"

type Computer struct {
ComputerType string
}

type ComputerClass interface {
PowerOn() string
PowerOff() string
}

func (c Computer) PowerOn() string {
ret := fmt.Sprintf("%s 开机", c.ComputerType)
return ret
}

func (c Computer) PowerOff() string {
ret := fmt.Sprintf("%s 关机", c.ComputerType)
return ret
}

// 下面是子类相关的内容

type Laptop struct {
ComputerSize int
// 在结构体中嵌套另一个结构体,并且只声明类型而不命名,称为匿名调用
// Go中通过这种匿名调用,表示Laptop继承了Computer中的属性
Computer
}

// 定义"子类"中独有的方法
type LaptopClass interface {
Move() string
}

func (laptop Laptop) Move() string {
ret := fmt.Sprintf("%d 寸电脑被拿走了", laptop.ComputerSize)
return ret
}

// 重新实现一个PowerOff方法,覆盖父类的同名方法
func (laptop Laptop) PowerOff() string {
ret := fmt.Sprintf("%s 被合上了盖子", laptop.ComputerType)
return ret
}

func main() {
// 结构体实例化
var lap Laptop
// 显示的声明"父类"的属性
lap.Computer.ComputerType = "laptop"
// 隐式的声明"父类"的属性,效果与显示声明一样
// lap.ComputerType = "laptop"

// 声明子类的属性
lap.ComputerSize = 14

// 调用"父类"的PowerOff方法
fmt.Println(lap.Computer.PowerOff())
// 调用"子类"的PowerOff方法
fmt.Println(lap.PowerOff())
}

运行结果

% go run main.go
laptop 关机
laptop 被合上了盖子