zoukankan      html  css  js  c++  java
  • go12---interface

    package main
    
    /*
    接口interface
    
    接口是一个或多个方法签名的集合
    只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示
    声明实现了哪个接口,这称为 Structural Typing
    接口只有方法声明,没有实现,没有数据字段
    接口可以匿名嵌入其它接口,或嵌入到结构中
    将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个
    复制品的指针,既无法修改复制品的状态,也无法获取指针
    只有当接口存储的类型和对象都为nil时,接口才等于nil
    接口调用不会做receiver的自动转换
    接口同样支持匿名字段方法
    接口也可实现类似OOP中的多态
    空接口可以作为任何类型数据的容器
    
    */
    
    import (
        "fmt"
    )
    
    type empty interface{} //任何结构都实现了空接口,
    
    type ReadWrite interface {
        readwrite()
    }
    
    type USB interface {
        Name() string //name方法返回usb的名称
        Connect()     //连接的方法
        ReadWrite     //接口的嵌入
    }
    
    type PhoneConect struct {
        name string
    }
    
    //PhoneConect实现USB接口
    //go语言没有显示说明实现了哪个接口,只要实现了接口中的方法就表示实现了接口
    func (pc PhoneConect) Name() string { //为接口添加方法,就是实现了接口USB
        return pc.name
    }
    
    func (pc PhoneConect) Connect() { //为接口添加方法,就是实现了接口USB
        fmt.Println("connect..", pc.name)
    }
    
    func (pc PhoneConect) readwrite() { //为接口添加方法,就是实现了接口USB,(每个方法都要实现)
        fmt.Println("readwrite...")
    }
    
    func main() {
        var a USB                             //a是一个USB接口类型
        a = PhoneConect{name: "PhoneConnect"} //PhoneConect实现了USB接口中的方法,就可以赋值给USB,子类可以给父类赋值,
        //a.name = "PhoneConnect"不能这写
        a.Connect()
        Disconnect(a) //Disconnect..
    
        a1 := PhoneConect{name: "PhoneConnect1"}
        Disconnect(a1) //Disconnect..
    }
    
    func Disconnect(usb USB) {
        if pcc, ok := usb.(PhoneConect); ok { //判断是不是PhoneConect,是的话ok=true,
            fmt.Println("pcc=", pcc)      //pcc= {PhoneConnect}
            fmt.Println("ok", ok)         //ok true
            fmt.Println("是usb", pcc.name) //是usb PhoneConnect
        }
        fmt.Println("Disconnect..")
    }
    
    func Disconnect1(usb interface{}) { //参数是空接口,表示可以接收任何类型,
        switch v := usb.(type) { //类型判断
        case PhoneConect:
            fmt.Println("disconnect..", v.name)
        default:
            fmt.Println("unknow")
        }
    }
    package main
    
    import (
        "fmt"
    )
    
    type Connecter interface {
        Connect()
    }
    
    type USB interface {
        Name() string
        Connecter
    }
    
    type PhoneConect struct {
        name string
    }
    
    //PhoneConect实现USM接口
    func (pc PhoneConect) Name() string {
        return pc.name
    }
    
    func (pc PhoneConect) Connect() {
        fmt.Println("connect..", pc.name)
    }
    
    func main() {
        a1 := PhoneConect{name: "PhoneConnect1"}
        var a2 USB
        var a3 Connecter
        a2 = USB(a1)       //子类强制转换为父类
        a3 = Connecter(a1) //子类强制转换为父类,只能调用父类的方法,不恩调用子类的方法
    
        a2.Connect()           //connect.. PhoneConnect1
        fmt.Println(a2.Name()) //PhoneConnect1
        a3.Connect()           //connect.. PhoneConnect1
        //a3.Name()没有这个方法了,只能调用父类的方法,不恩调用子类的方法(java也是,需要强制转化为子类对象)
    }
    package main
    
    import (
        "fmt"
    )
    
    type Connecter interface {
        Connect()
    }
    
    type USB interface {
        Name() string
        Connecter
    }
    
    type PhoneConect struct {
        name string
    }
    
    //PhoneConect实现USM接口
    func (pc PhoneConect) Name() string {
        return pc.name
    }
    
    func (pc PhoneConect) Connect() {
        fmt.Println("connect..", pc.name)
    }
    
    func main1() {
        a1 := PhoneConect{name: "PhoneConnect1"} //子类
        var a3 Connecter                         //父类
        a3 = Connecter(a1)                       //子类强制转换成父类
    
        a3.Connect()              //父类对象也只能调用父类有的方法,connect.. PhoneConnect1
        a1.name = "PhoneConnect2" //子类的属性改了
        a3.Connect()              //connect.. PhoneConnect1,父类并没有改,说明子类给接口赋值拿到的是一个拷贝
        //因此,将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个
        //复制品的指针,既无法修改复制品的状态,也无法获取指针
    
    }
    
    func main() {
        var a1 interface{}     //空接口是一个类型,不能写成var a1 := interface{}
        fmt.Println(a1 == nil) //true
    
        var p *int = nil //p是指向int型的指针
        a1 = p
        fmt.Println(a1 == nil) //false
    }

     

  • 相关阅读:
    鼠标滑动带动画下拉展开的滑动门代码
    很靓很大气的简约红色CSS菜单代码
    用Cookie来保存菜单当前位置代码
    单击单选按钮切换对应的菜单代码
    仿微软中国的滑动门导航菜单代码
    C#创建SQLServer的存储过程
    通过应用程序域AppDomain加载和卸载程序集(转载)
    多线程学习笔记一(转载)
    C#实现Treeview节点"正在载入..."效果
    JavaScript 学习笔记之函数理解二
  • 原文地址:https://www.cnblogs.com/yaowen/p/8080170.html
Copyright © 2011-2022 走看看