go十:面向对象之继承

在go中继承,叫匿名字段

1.匿名字段继承

package main

import "fmt"

type person struct {
    name string
    age int
    sex string
}
//结构体嵌套结构体,也可认为是继承
type Student struct {
    //通过匿名字段实现继承操作
    person //结构体名称,作为另一个结构体的成员
    id int
    score int
}
func main() {
    var stu Student
    stu.id = 101
    stu.name = "张天"
    stu.score = 99
    stu.sex = ""
    fmt.Println(stu)  //{{张天 0 男} 101 99}

    var st Student = Student{person{"张三慧", 200, ""}, 102, 88}
    fmt.Println(st)  //{{张三慧 200 男} 102 88}
}

 

2.同名字段继承

package main

import "fmt"

type pers struct {
    name string
    age int
    sex string
}
type stud struct {
    pers
    id int
    name string
    score int
}
func main() {
    var stu stud
    //采用就近原则,使用子类信息
    stu.name = "张三丰"
    stu.score = 90
    stu.age = 999
    fmt.Println(stu)  //{{ 999 } 0 张三丰 90}
    //结构体变量.匿名字段.结构体成员
    stu.pers.name = "张四丰"
    fmt.Println(stu)  //{{张四丰 999 } 0 张三丰 90}
    var st stud = stud{pers{"张五慧", 99, "sex"}, 108, "张六慧", 99}
    fmt.Println(st)  //{{张五慧 99 sex} 108 张六慧 99}

 

 

3.指针匿名字段

package main

import "fmt"

type per struct {
    name string
    age int
    sex string
}
type stu struct {
    *per  //指针匿名字段
    id int
    name string
    score int
}
func main() {
    var s1 stu
    s1.per = new(per)      //指针类型的匿名字段,必须先new(父结构体)
    //或才将s1.per指向一个结构的指针
    //var p = per{"杨过", 32, "男"}
    //s1.per = &p

    s1.name = "郭靖"
    s1.per.name = "郭靖靖"
    fmt.Println(s1)  //{0xc0420601e0 0 郭靖 0}
    fmt.Println(s1.name, s1.per.name)  //郭靖 郭靖靖
}

 

4.多重继承

继承方式一:多层次继承

package main
import "fmt"
type A struct {
    name string
    id int
}
type B struct {
    A
    sex string
}
type C struct {
    B
    score int
}
func main() {
    var s C
    s.name = "名字A"
    s.id =23
    s.sex = "性别B"
    s.score = 99
    fmt.Println(s)  //{{{名字A 23} 性别B} 99}

    var ss C
    ss.score = 99
    ss.B.sex = "BB"
    ss.B.A.name = "AA"
    fmt.Println(ss)  //{{{AA 0} BB} 99}
}

 

方式二:继承多个父类

package main

import "fmt"

type A struct {
    name string
    id int
}
type B struct {
    sex string
}
type C struct {
    A
    B
    score int
}
func main() {
    var s C
    s.name = "名字A"
    s.id =23
    s.sex = "性别B"
    s.score = 99
    fmt.Println(s)  //{{名字A 23} {性别B} 99}

    var ss C
    ss.score = 99
    ss.B.sex = "BB"
    ss.A.name = "AA"
    fmt.Println(ss)  //{{AA 0} {BB} 99}
}

 

posted on 2018-03-29 21:37  myworldworld  阅读(116)  评论(0)    收藏  举报

导航