golang继承与接口

作者: 吃猫的鱼0 | 来源:发表于2018-01-04 10:58 被阅读3次

继承

结构体

Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继 承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性。 组合甚至不能算面向对象特性,因为在C语言这样的过程式编程语言中,也有结构体,也有组合。组合只是形成复合类型的基础。

type Rect struct {
    x, y float64
    width, height float64
}

简单继承

package main

import (
    "fmt"
)

type Father struct {
    MingZi string
}

func (this *Father) Say() string {
    return "大家好,我叫 " + this.MingZi
}

type Child struct {
    Father
}

func main() {
    c := new(Child)
    c.MingZi = "小明"
    fmt.Println(c.Say())
}

多重继承

package main

import (
    "fmt"
)
type Father struct {
    MingZi string
}

func (this *Father) Say() string {
    return "大家好,我叫 " + this.MingZi
}
type Mother struct {
    Name string
}

func (this *Mother) Say() string {
    return "Hello, my name is " + this.Name
}
type Child struct {
    Father
    Mother
}
func main() {
    c := new(Child)
    c.MingZi = "小明"
    c.Name = "xiaoming"
    fmt.Println(c.Father.Say())
    fmt.Println(c.Mother.Say())
}

名字冲突问题

package main
import(
    "fmt"
)
type X struct {
    Name string
}
type Y struct {
    X
    Name string //相同名字的属性名会覆盖父类的属性
}
func main(){
    y := Y{X{"XChenys"},"YChenys"}
    fmt.Println("y.Name = ",y.Name) //y.Name = YChenys
}

所有的Y类型的Name成员的访问都只会访问到最外层的那个Name变量,X.Name变量相当于被覆盖了,可以用y.X.Name引用

接口

在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口,

根据《Go 语言中的方法,接口和嵌入类型》的描述可以看出,接口去调用结构体的方法时需要针对接受者的不同去区分,即:

  • 接收者是指针*T时,接口实例必须是指针
  • 接收者是值 T时,接口实力可以是指针也可以是值
  • 接口的定义和类型转换与接收者的定义是关联的

接口继承

栗子:

package main

import (
    "fmt"
)

type Action interface {
    Sing()
}

type Cat struct {
}
type Dog struct {
}

func (*Cat) Sing() {
    fmt.Println("Cat is singing")
}
func (*Dog) Sing() {
    fmt.Println("Dog is singing")
}
func Asing(a Action) {
    a.Sing()
}
func main() {
    cat := new(Cat)
    dog := new(Dog)
    Asing(cat)
    Asing(dog)
}

接口使用

栗子:

package main

import "fmt"

type Type struct {
     name string
}

type PType struct {
     name string
}

type Inter iInterface {
     post()
}

// 接收者非指针
func (t Type) post() {
    fmt.Println("POST")
}

// 接收者是指针
func (t *PType) post() {
    fmt.Println("POST")
}

func main()
{
    var it Inter
    //var it *Inter //接口不能定义为指针
    pty := new(Type)
    ty := {"type"}
    it = ty // 将变量赋值给接口,OK
    it.post() // 接口调用方法,OK
    it = pty // 把指针变量赋值给接口,OK
    it.post() // 接口调用方法,OK

    pty2 := new(PType)
    ty2 := {"ptype"}
    it = ty2 // 将变量赋值给接口,error
    it.post() // 接口调用方法,error
    it = pty2 // 把指针变量赋值给接口,OK
    it.post() // 接口调用方法,OK
}

相关文章

  • golang继承与接口

    继承 结构体 Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继 承...

  • Golang面向对象编程之继承&虚基类【组合&接

    [TOC] Golang面向对象编程之继承&虚基类【组合&接口】 201808 相关说明 Golang里面没有像C...

  • 《Oracle Java SE编程指南》15-03:接口继承接口

    内容导航: 前言 1、接口继承接口 2、多重继承 3、接口继承与类继承 前言 有些时候,定义了一个接口后,需要对该...

  • 接口的继承与抽象类

    接口继承 接口继承(inheritance)与类继承很类似,就是以被继承的 interface 为基础,增添新增的...

  • 继承与接口

    派生类生成一个对象时,基类与子类在内存中的排列状态: 当子类中定义的成员变量与父类的成员变量同名时,由于构造函数是...

  • 继承与接口

    继承方式 如果不指定public,C++默认的继承是私有继承..1.公有继承:派生类的对象可以访问基类中的公有成员...

  • 继承与接口

    一个类可以继承多个接囗,那么这样的类是如何继承多个我要的?

  • 程序组第二次作业代码

    继承与多态: 接口作业:

  • Thread的创建方式

    继承Thread类与实现Runnable接口 何时继承与何时实现接口 一般情况下,我们尽量使用实现接口的方式,遵循...

  • Java接口

    抽象类,抽象方法 接口 策略设计模式 适配器模式 多继承 接口的继承 接口中的域 接口与工厂

网友评论

    本文标题:golang继承与接口

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