Golang初级系列教程-多重继承
继承是子类自动获取父类属性和方法的能力。多重继承则是获的多个父类的属性和方法。举一个真实的例子,定义类型 Phone
, 那么 MobilePhone
继承自 Phone
,而对于 CameraPhone
同时具有 Camera
和 Phone
的功能特性,相同的例子还有很多。那么 CameraPhone
如果同时具有 Camera
和 Phone
的特性呢,一种直接简单的方法就是让 CameraPhone
同时继承 Camera
和 Phone
(注意:在上面的例子中,还有一种方法是将 Camera
嵌入 Phone
中或者将 Phone
嵌入 Camera
中,但是也有例外——一个孩子同时继承其父母的特点)。
一些面向对象语言干脆拒绝使用多重继承,而另一些则使用 interface
的方法实现。然而,Go
支持多重继承。而实现方式,则和我们之前使用匿名字段实现单继承的方式相同。接下来,让我们实现上述 Camera
+ Phone
= CameraPhone
的例子。
package main
import "fmt"
type Camera struct { }
func (_ Camera) takePicture() string { //not using the type, so discard it by putting a _
return "Click"
}
type Phone struct { }
func (_ Phone ) call() string { //not using the type, so discard it by putting a _
return "Ring Ring"
}
// multiple inheritance
type CameraPhone struct {
Camera //has anonymous camera
Phone //has anonymous phone
}
func main() {
cp := new (CameraPhone) //a new camera phone instance
fmt.Println("Our new CameraPhone exhibits multiple behaviors ...")
fmt.Println("It can take a picture: ", cp.takePicture()) //exhibits behavior of a Camera
fmt.Println("It can also make calls: ", cp.call()) //... and also that of a Phone
}
Our new CameraPhone exhibits multiple behaviors ...
It can take a picture: Click
It can also make calls: Ring Ring
在上面的代码中,分别定义了 Camera
和 Phone
。通过匿名字段的方式,放入 CameraPhone
中,则实现了多重继承的概念。
也许你已经注意到了,在 Go
中,语法结构非常简单,但是就是这样简单的特性,可以比其他语言设计出巨大的扩展。
Golang一种神奇的语言,让我们一起进步