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
}
复制代码

 

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/8080170.html,如需转载请自行联系原作者

相关文章
|
3天前
|
C#
C# 接口(Interface)
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。 接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。 接口使得实现接口的类或结构在形式上保持一致。 抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。 接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。 抽象类不能直接实例化,但允许派生出具体的,具有实际功能的类。
27 9
|
5月前
|
Java
接口(interface)
接口(interface)
|
Java 编译器 开发工具
@interface的用法
@interface的用法
接口(interface)
接口是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法(JDK 9)。最重要的就是其中的抽象方法
|
网络虚拟化
|
网络虚拟化 网络协议 ARouter