golang继承与接口

继承

结构体

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
}

作者:吃猫的鱼0
链接:https://www.jianshu.com/p/fe8c366dcd1d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/ExMan/p/11773843.html

时间: 2024-07-31 00:40:21

golang继承与接口的相关文章

继承与接口1

下面程序输出什么: #include<iostream> using namespace std; class A { public: void virtual f(){ cout<<"A"<<endl; } }; class B:public A{ public: void virtual f(){ cout<<"B"<<endl; } }; int main() { A* pa=new A();//定义

Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript时,可以选择面向过程的方式编程,显得高效:但在实际工作中,遇到的项目需求和框架较大的情况下,选择面向对象的方式编程显得尤其重要,Javascript原生语法中没有提供表述面向对象语言特性的关键字和语法(如extends.implement).为了实现这些面向对象的特性,需要额外编写一些代码,如下.

关于Java中继承和接口的理解

关于Java中继承和接口的理解 Java语言中,为了实现代码重用,设计了继承这一机制,但是,其设计成单继承,这样设计是有原因的,如下图: Figure1:deadly diamond of death 此图问题称为菱形问题(diamond problem),就是说,当A的子类B和C同时实现了A中的方法,则同时继承了B和C的子类D在调用该方法时会出现混乱,无法得知该调用哪一个方法. 既然不能实现多继承,我们就会考虑把很多方法就写在父类里,或者继承抽象类,实现其方法,但是,这样会导致一个问题,比如说

黑马程序员——JAVA学习笔记四(继承、接口、内部类)

1,    通过extends关键字让类与类之间产生继承关系.多个类中存在相同属性和行为时,将这些内容抽取到单独的一个类中,那么多个类无需定义这些属性和行为,只要继承那个类即可,已存在的类叫做超类,基类,或父类.新类称为子类,派生类,孩子类. 子类可以直接访问父类中的非私有的属性和行为.子类无法继承父类中私有的内容.JAVA不支持多继承,只支持单继承,多实现. 继承提高了代码复用性,让类与类之间产生了关系.为多态提供了前提. 2,    super关键字代表父类中成员变量内存空间的标示.两个作用

面向对象,继承和接口的使用理解

面向对象: 将你要将各种小类组合成一个大类的时候,面向对象的思想只需要在大类中添加一个小类的实例.这样可以提升代码的重用率. 继承: 当需要对父类进行扩张来得到一个拥有一些额外方法或者属性的时候使用.当父类的一些东西需要重写时使用也相当重要.抽象类:抽象类.中的抽象方法必须被实现,而可以有非abstract的方法和数据.这就区别于接口使得它更加灵活.在某些特定方法只会在这个类的子类中需要使用的时候,就没有必要特地为这个方法书写一个接口.抽象类用于抽象一个实际物品的时候特别有效. 接口: 因为接口

编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程

建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttribute.OnDeserializingAttribute.OnSerializedAttribute.OnSerializingAttribute.NoSerializable等特性不能完全满足自定义序列化的要求,那就需要继承ISerializable了. 以下是格式化器的工作流程:如果格式化器

继承 与 接口

继承(上): 1. 提高了代码的重用性 2. 让类与类之间产生关系,有了这个关系,才有多态性 注意:千万不要为了获取其他功能,简化代码而继承: 必须是类与类之间有所属关系才可以继承,所属关系 is a. 在java语言中只能是单继承,不支持多继承. 因为:多继承容易带来安全隐患,当多个父类有相同的功能, 当功能内容不同时,子对象不确定运行哪一个. 但是java保留这种机制,用另一种形式表示:多实现. 并且存在多层继承,也就是一个继承体系. 如何使用一个继承体系中的功能? 要想使用体系,先查阅体系

从头认识java-7.5 怎样通过继承扩展接口?

我们这一章节来讨论一下怎样通过继承扩展接口. 接口跟类一样,具有继承的特性,但是他只是继承接口,不继承类. package com.ray.ch07; interface WhatPersonCanDo { void run(); void sleep(); } interface WhatSingerCanDo extends WhatPersonCanDo { void sing(); } class Singer implements WhatSingerCanDo { @Override

基础学习day07---面向对象三---继承,接口与 抽象类

一.继承 1.1.继承概念 将对象的共性抽取出来.提取出一个单独的类. 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径 类A可以有自己的属性和方法通过 extends 关键字让类与类之间产生继承关系. 让类和类之间产生了关系,有了这个关系,才有了多态的特性. 注意:千万不要为了获取其他类的功能,简化代码而继承. 必须是类与类之间有所属关系才可以继承,所属关系是 is  a.的关系 1.2