go实现面向对象特性
实现面向对象特性
封装
type Hero struct {
Name string
Ad int
Level int
}
func (this *Hero) Show() {
fmt.Println("Name = ", this.Name)
fmt.Println("Ad = ", this.Ad)
fmt.Println("Level = ", this.Level)
}
func (this *Hero) GetName() string {
return this.Name
}
func (this *Hero) SetName(newName string) {
//this是调用该方法的对象的-一个副本(拷员)
this.Name = newName
}
func main() {
//仙建一个对象
hero := Hero{Name: "zhang3", Ad: 100, Level: 10}
hero.Show()
hero.SetName("li4")
hero.Show()
//fmt.Println(mymap)
}
继承
type Human struct {
name string
sex string
}
func (this *Human) Eat() {
fmt.Println("Human.Eat()...")
}
func (this *Human) Walk() {
fmt.Println("Human.Walk()...")
}
type SuperMan struct {
Human //SuperMan类继承了Human类的方法
level int
}
//重定义父类的方法Eat()
func (this *SuperMan) Eat() {
fmt.Println("SuperMan.Eat()...")
}
//子类的新方法
func (this *SuperMan) Fly() {
fmt.Println("SuperMan.Fly()...")
}
func main() {
h := Human{"zhang3", "female"}
h.Eat()
h.Walk()
//定义一个子类对象
s := SuperMan{Human{"li4", "female"}, 88}
s.Walk() //父类的方法
s.Eat() //子类的方法
s.Fly() //子 类的方法
}
多态
有一个父类(有接口)
有子类(实现了父类的全部接口方法)
父类类型的变量(指针)指向(引用)子类的具体数据变量
//本质是一一个指针
type AnimalIF interface {
Sleep()
GetColor() string //获取动物的颜色
GetType() string //获取动物的种类
}
//具体的类
type Cat struct {
color string //猫的颜色
}
func (this *Cat) Sleep() {
fmt.Println("Cat is Sleep")
}
func (this *Cat) GetColor() string {
return this.color
}
func (this *Cat) GetType() string {
return "Cat"
}
//具体的类,
type Dog struct {
color string
}
func (this *Dog) Sleep() {
fmt.Println("Dog is Sleep")
}
func (this *Dog) GetColor() string {
return this.color
}
func (this *Dog) GetType() string {
return "Dog"
}
func showAnimal(animal AnimalIF) {
animal.Sleep() //多态
fmt.Println("color = ", animal.GetColor())
fmt.Println("kind = ", animal.GetType())
}
func main() {
//var animal AnimalIF //接口的数据类型,父类指针
//animal = &Cat{"Green"}
//animal.Sleep() //调用的就是Cat的Sleep()方法
//
//animal = &Dog{"yellow"}
//animal.Sleep() //调用的就是Dog的Sleep()方法
cat := Cat{"Green"}
dog := Dog{"Yellow"}
showAnimal(&cat)
showAnimal(&dog )
}