美文网首页
16.Go语言·面向对象编程应用·接口(三)

16.Go语言·面向对象编程应用·接口(三)

作者: 一枼落知天下 | 来源:发表于2019-06-06 16:48 被阅读0次

    main.go

    // Go语言·面向对象编程应用·接口
    package main
    
    //  包的本质是创建不同的文件夹
    //  go的每一个文件都是属于一个包的
    //  go以包的形式管理项目和文件目录。
    //  import "包的路径"
    import (
        model "day23/model"
        "fmt"
        "sort"
        "math/rand"
    )
    
    var content string = `
    ————————————————Go语言·面向对象编程应用·接口————————————————————
    一、接口 interface 最佳实践
    
    二、继承和接口
        1.当结构体A继承咯结构体B,那么A结构体就自动的继承咯B结构体的字段和方法,
        并且可以直接使用。
        2.当A结构体需要扩展功能,同时不希望破坏原来的继承关系,则可以去实现某个
        接口即可,
        因此:实现接口是对继承机制的补充。
        3.继承和接口解决的问题不同:
            继承的价值:解决代码的复用性和可维护性
            接口的价值:设计,设计好各种规范(方法),让其他自定义类型去实现这些方法。
        4.接口比继承更加灵活:
            继承是满足 is-a的关系 Student 是一个Person
            接口只需要满足like-a个关系 the Monkey like a Bird fly
        5.接口在一定程度上实现代码解耦。
    三、多态:
        1.多态参数
            // usb接口变量,就体现多态-————多态参数
            pc     := &model.Computer{}
            phone  := &model.Phone{}
            camera := &model.Camera{}
            pc.Working(phone)  //多态参数
            pc.Working(camera) //多态参数
        2.多态数组
            // 多态数组:
            var usbArr [3]model.Usb //接口数组
            usbArr[0] = model.Phone{"Iphone x max"}
            usbArr[1] = model.Phone{"小米"}
            usbArr[2] = model.Camera{"Sony"}
            fmt.Println(usbArr)
    `
    type Interface interface {
        // Len方法返回集合中的元素个数
        Len() int
        // Less方法报告索引i的元素是否比索引j的元素小
        Less(i, j int) bool
        // Swap方法交换索引i和j的两个元素
        Swap(i, j int)
    }
    
    
    type Hero struct {
        Name string
        Age int
    }
    
    type HeroSlice []Hero
    
    // 实现interface接口
    func (hs HeroSlice) Len() int {
        return len(hs)
    }
    
    func (hs HeroSlice) Less(i,j int) bool {
        return hs[i].Age < hs[j].Age
    }
    
    
    func (hs HeroSlice) Swap(i,j int) {
        // 交换
        // temp := hs[i]
        // hs[i] = hs[j]
        // hs[j] = temp
        hs[i],hs[j] = hs[j],hs[i]
    }
    
    
    type Student struct {
        Name string
        Age int
        Score float64
    }
    
    type studentSlice []Student
    
    
    func (ss studentSlice) Len() int {
        return len(ss)
    }
    
    func (ss studentSlice) Less(i,j int) bool {
        // return ss[i].Score < ss[j].Score
        // return ss[i].Age < ss[j].Age
        return ss[i].Name < ss[j].Name
    }
    
    
    func (ss studentSlice) Swap(i,j int) {
        ss[i],ss[j] = ss[j],ss[i]
    }
    
    func main() {
        // var intSlice = []int{0,-1,10,7,90}
        // 对切片排序
        // 1.冒泡排序
        // 2.系统提供的方法
        // sort.Ints(intSlice)
        // fmt.Println(intSlice)
    
        // var heros HeroSlice
        // for i := 0; i < 10; i++ {
        //  hero := Hero{
        //      Name:fmt.Sprintf("No.%.3d", rand.Intn(100)),
        //      Age :rand.Intn(100),
        //  }
        //  heros = append(heros,hero)
        // }
    
        // for _,v :=range heros {
        //  fmt.Println(v)
        // }
    
        // fmt.Println()
        // fmt.Println("排序后:")
        // // 调用sort.sort()
        // sort.Sort(heros)
        // for _,v :=range heros {
        //  fmt.Println(v)
        // }
        
        var students studentSlice
        for i := 0; i <10; i++ {
            student := Student{
                Name:fmt.Sprintf("No.%.3d", rand.Intn(100)),
                Age: rand.Intn(100),
                Score:float64(rand.Intn(100)),
            }
            students = append(students,student)
        }
    
        for _,v :=range students {
            fmt.Println(v)
        }
    
        fmt.Println()
        fmt.Println("______________排序后:")
        // 调用sort.sort()
        sort.Sort(students)
        for _,v :=range students {
            fmt.Println(v)
        }
        
        fmt.Println()
        fmt.Println("———————————————————继承和接口—————————————")
        wukong := model.Wukong{
            model.Monkey{
                Name:"悟空[大师兄]",
            },
        }
        wukong.Climb()
        wukong.Flying()
        wukong.Swiming()
    
        fmt.Println()
        fmt.Println("———————————————————多态—————————————")
        pc     := &model.Computer{}
        phone  := &model.Phone{}
        camera := &model.Camera{}
        pc.Working(phone)
        pc.Working(camera)
    
        // 定义一个Usb接口数组,可以存放Phone和Camera结构体变量
        // 多态数组:
        var usbArr [3]model.Usb
        usbArr[0] = model.Phone{"Iphone x max"}
        usbArr[1] = model.Phone{"小米"}
        usbArr[2] = model.Camera{"Sony"}
        fmt.Println(usbArr)
    
    }
    

    monkey.go

    package model
    
    import (
        "fmt"
    )
    
    type Monkey struct {
        Name string
    }
    
    type Bird interface {
        Flying()
    }
    
    type Fish interface {
        Swiming()
    }
    
    func (this *Monkey) Climb() {
        fmt.Println(this.Name,"大闹天宫!!")
    }
    
    
    type Wukong struct {
        Monkey
    }
    
    
    func (this *Wukong) Flying() {
        fmt.Println(this.Name,"一个筋斗云~~~十万八千里(^U^)ノ~YO")
    }
    
    func (this *Wukong) Swiming() {
        fmt.Println(this.Name,"下海,找东海龙王玩~~获得如意棒,(*^__^*) 嘻嘻")
    }
    
    

    interface.go

    package model
    
    import (
        "fmt"
    )
    // 定义或声明一个接口
    type Usb interface {
        // 声明两个没有实现的方法
        Start()
        Stop()
    }
    
    // 手机
    type Phone struct {
        Name string
    }
    // 让phone实现Usb接口的方法
    func (p Phone) Start() {
        fmt.Println("手机开始工作咯...")
    }
    
    func (p Phone) Stop() {
        fmt.Println("手机停止工作咯...")
    }
    
    
    // 相机
    type Camera struct {
        Name string
    }
    // 让Camera实现Usb接口的方法
    func (c Camera) Start() {
        fmt.Println("相机开始工作咯...")
    }
    
    func (c Camera) Stop() {
        fmt.Println("相机停止工作咯...")
    }
    
    
    // 计算机
    type Computer struct {
        
    }
    
    // working方法,接收一个Usb接口类型变量
    // 实现Usb接口---》实现Usb接口声明的所有方法。
    // usb接口变量,就体现多态-————多态参数
    func (c *Computer) Working(usb Usb) {
        // 通过usb接口变量来调用Start和Stop方法
        usb.Start()
        usb.Stop()
    }
    
    

    相关文章

      网友评论

          本文标题:16.Go语言·面向对象编程应用·接口(三)

          本文链接:https://www.haomeiwen.com/subject/msuuxctx.html