Go---继承

继承
继承可以解决代码复用。
当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法。
其它的结构体不需要重新定义这些属性和方法,只需嵌套一个匿名结构体即可。
也就是说:在Golang中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性

嵌套匿名结构体的基本语法
type Goods struct {
    Name string

    Price int
}
type Book struct {
 
 Goods //这里就是嵌套匿名结构体Goods

    Writer string
}

继承实例 

package main

import (

    "fmt"

)

//编写一个学生考试

//学生

type Student struct {

    Name string

    Age int

    Score int

}

type Pupil struct {

    Student //嵌入了Student匿名结构体

}

type Graduate struct {

    Student //嵌入了Student匿名结构体

}

//给*Student增加一个方法,那么Pupil和 Graduate都可以使用该方法

func (stu *Student) GetSum(n1 int ,n2 int ) int {

    return n1 + n2

}

//显示成绩

func (s *Student) ShowInfo(){

    fmt.Printf("姓名:%v 年龄 : %v  成绩:%v \n",s.Name,s.Age,s.Score)

}

//设置分数

func (s *Student) SetScore(score int){

    s.Score=score

}

func (p *Pupil) tesing(){

    fmt.Println("pupil tesing.....")

}

func (g *Graduate) tesing(){

    fmt.Println("Graduate tesing......")

}
 

func main() {

    pupil := &Pupil{}

    pupil.Student.Name ="logn"

    pupil.Student.Age =66

    pupil.tesing()

    pupil.Student.SetScore(77)

    pupil.Student.ShowInfo()

    fmt.Println(pupil.Student.GetSum(1,2))

   

    graduate := &Graduate{}

    graduate.Student.Name ="heyhey"

    graduate.Student.Age =19

    graduate.tesing()

    graduate.Student.SetScore(89)

    graduate.Student.ShowInfo()

}

继承的细节
1) 结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。
2) 匿名结构体字段访问可以简化

  当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分。

4) 结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,否则编译报错。

5))如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字

type Hello struct{

    stu Student //有名的结构体  组合关系

}

   var hello Hello

    hello.stu.Name ="hello"

    fmt.Println(hello.stu.Name)

6) 嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值

type Goods struct {

    Name string

    Num int

}

type Brands struct {

    Name string

    Price float64

}

type Sport struct{

    Goods

    Brands

}

type Sport2 struct{

    *Goods

    *Brands

}

 func main() {

  nike := Sport{

        Goods{"运动",8888},

        Brands{"nike",456.123},

    }

    xter := Sport{

        Goods{

            Name: "跑鞋",

            Num: 8888,

        },

        Brands{

            Name: "特步",

            Price: 96.12,

        },

    }

    fmt.Println("nike",nike)

    fmt.Println("特步",xter)

    xter2 := Sport2{

        &Goods{

            Name: "衣服",

            Num: 8888,

        },

        &Brands{

            Name: "衣服",

            Price: 96.12,

        },

    }

    fmt.Println("特步2",*xter2.Goods,*xter2.Brands)

}

结构体的匿名字段是基本数据类型

 说明
  1) 如果一个结构体有int类型的匿名字段,就不能第二个。

  2) 如果需要有多个int的字段,则必须给int字段指定名字

面向对象编程-多重继承
  如一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的段和方法,从而实现了多重继承。

多重继承细节
1)如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分。
2)为了保证代码的简洁性,建议大家尽量不使用多重继承

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值