所谓的继承,就是让子类调用父类已经定义的方法。引用上文中的Computer"类"的案列,Computer就可以作为一个父类,具备通用的开机和关机两个方法。Laptop作为Computer的子类,当然也应该可以使用开关机的方法。这个继承在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))


# 实例化子类并根据声明将父类和子类所需的参数一并传入
lap = Laptop(14, "laptop")
lap.move()
# 在子类中可以调用父类的方法
lap.PowerOn()
lap.PowerOff()

运行结果

% python main.py
14 寸的电脑被拿走了
laptop 开机
laptop 关机


前文提到,Go中实现面相对象的效果。本质上是通过struct作为核心将interface和方法关联起来的,那么继承的实现其实也是通过struct的之间的匿名调用实现类似继承的效果。

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
}

// laptop 子类中特有的方法
type LaptopClass interface {
Move() string
}

// laptop 有自己特殊的方法
func (laptop Laptop) Move() string {
ret := fmt.Sprintf("%d 寸电脑被拿走了", laptop.ComputerSize)
return ret
}

// 检测接口的方法
func TestSubInterface(l LaptopClass) {
fmt.Println(l.Move())
}

func TestRootInterface(c ComputerClass) {
fmt.Println(c.PowerOn())
fmt.Println(c.PowerOff())
}

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

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

// lap 满足了子类接口的方法实现要求
// lap变量可以被当做 LaptopClass
TestSubInterface(lap)

// lap 也满足了父类接口的方法实现要求
// lap变量可以被当做 ComputerClass
TestRootInterface(lap)

}

运行结果,证明Laptop这个子类的struct 被当做父类的数据类型使用,也可以继承父类方法,

%  go run main.go
14 寸电脑被拿走了
laptop 开机
laptop 关机