zoukankan      html  css  js  c++  java
  • 6.2 Go 匿名字段

     6.2 Go 匿名字段

    Golang匿名字段:可以像访问字段成员那样,访问匿名字段方法,go编译器自动查找。

    package main
    
    import "fmt"
    
    type Student struct {
        id   int
        name string
    }
    
    type Teacher struct {
        //匿名字段
        Student
    }
    
    func (s1 *Student) Play() {
        fmt.Printf("Student地址:%p,值是%v
    ", s1, s1)
        fmt.Println("我是个学生,但是我就爱玩儿,你能奈我何")
    }
    func main() {
        t1 := &Teacher{Student{1, "银角大王吧"}}
        //两种方式一样效果
        /*
            t1 := &Teacher{
                Student{
                    1,
                    "银角大王吧",
                },
            }
        */
        fmt.Printf("t1的内存地址:%p
    ", &t1)
        //通过t1变量,执行结构体Student的方法,查找
        t1.Play() //  t1 -> Teacher -> *Student
    }
    

    通过匿名字段可以实现

    重写 override

    1.1. Go继承实战

    写一个学生管理系统,学生类别有(小学生、中学生、大学生),既然是学生群体都可以(查询成绩、设置成绩)

    package main
    
    import "fmt"
    
    //学生结构体
    type Student struct {
        Name  string
        Age   int
        Score int
    }
    
    //显示学生个人信息方法,接收指针类型
    func (stu *Student) ShowInfo() {
        fmt.Printf("学生姓名:%v 年龄=%d 成绩=%d
    ", stu.Name, stu.Age, stu.Score)
    }
    
    //设置学生成绩
    func (stu *Student) SetScore(score int) {
        stu.Score = score
    }
    
    //小学生群体 单词pupil
    type Pupil struct {
        //小学生的属性完全可以继承Student学生的属性
        Student //继承匿名字段
    }
    
    //小学生独有方法
    func (p *Pupil) testing() {
        fmt.Println("小学生正在考试中..")
    }
    
    //大学生结构体,同样的也有学生的常见属性
    type Graduate struct {
        Student
    }
    
    //大学生独有的方法
    func (g *Graduate) testing() {
        fmt.Println("大学生正在答辩考试中...")
    }
    
    func main() {
        p1 := &Pupil{Student{"小学生一号", 7, 99}}
        p1.testing()
        p1.ShowInfo()
        p1.SetScore(100)
        p1.ShowInfo()
        fmt.Println("-----------")
        g1 := &Graduate{Student{"大学生一号", 22, 50}}
        g1.testing()
        g1.ShowInfo()
        g1.SetScore(60)
        g1.ShowInfo()
    }
    

    继承给Go程序带来了代码的复用性提高了,代码的可维护性、扩展性更高了!

    注意点:

    如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现继承
    如果一个struct嵌套了另一个【有名】的结构体,那么这个模式叫做组合
  • 相关阅读:
    get(0)??
    抽象类中。。
    matlab函数
    unity_快捷键
    unity_ UI
    关于博客园使用
    survival shooter
    第七次团队作业:Alpha冲刺(3/10)
    第七次团队作业:Alpha冲刺(2/10)
    第七次团队作业:Alpha冲刺(1/10)
  • 原文地址:https://www.cnblogs.com/open-yang/p/11256881.html
Copyright © 2011-2022 走看看