结构体的组合(类似面向对象的继承)
先声明一个类:
package main
import "fmt"
type Human struct {
name string
sex string
}
func (this *Human) Eat() {
fmt.Println("Human.Eat()...")
}
func (this *Human) Walk() {
fmt.Println("Human.Walk()...")
}
func main() {
h := Human{"张三", "男"} // 使用大括号,内部填入相关类的属性值
h.Eat()
h.Walk()
}
声明一个Human类
- 有姓名、性别两个属性
- 有Eat和Walk两个方法
运行结果:
现在要创建一个新的类来继承Human,并在此基础上添加一些新的属性和方法,重写原有的内容,扩展类的功能。
代码如下:
package main
import "fmt"
type Human struct {
name string
sex string
}
func (this *Human) Eat() {
fmt.Println("Human.Eat()...")
}
func (this *Human) Walk() {
fmt.Println("Human.Walk()...")
}
// ======================父类==================================
// 声明一个SuperMan类用来继承
type SuperMan struct {
Human //SuperMan类继承了Human类的方法
level int
}
// 重写父类的方法Eat()
func (this *SuperMan) Eat() {
fmt.Println("SuperMan.Eat()...")
}
// 子类的新方法
func (this *SuperMan) Fly() {
fmt.Println("SuperMan.Flay()...")
}
func (this *SuperMan) Print() {
fmt.Println("name = ",this.name)
fmt.Println("sex = ",this.sex)
fmt.Println("level = ",this.level)
}
func main() {
// h := Human{"张三", "男"} // 使用大括号,内部填入相关类的属性值
// h.Eat()
// h.Walk()
// 实例化一个SuperMan类的对象
// 写法一:在子类中首先声明父类相关的属性,之后再声明其他属性
// s := SuperMan{Human{"李四", "男"}, 100}
// 写法二:先声明对象,之后通过【.属性】来实例化对象的属性,提高可读性
var s SuperMan // 使用var实例化一个对象
s.name = "李四"
s.sex="男"
s.level = 100
s.Walk() //父类的方法
s.Eat() // 重写之后的子类的方法
s.Fly() // 子类新建的方法
s.Print()
}
- 18-23行创建了SuperMan结构体,继承自Human,添加了新属性level
- 25-28行重写了Eat方法
- 31-33行添加子类了新的Fly方法
- 35-39行添加新的方法打印子类的属性
46-53行实例化子类
- 47-48行方法1实例化时需要在{}内先声明继承的父类的属性
- 49-54行方法2方法更利用可读性,先使用var声明对象,然后依次给属性赋值
运行结果:
可以看到成功继承了相关的属性,并且重写和新加的方法,在子类中都正常运行
此处评论已关闭