继承

结构体

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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

golang继承与接口的更多相关文章

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

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  2. C#类继承和接口继承时一些模棱两可的问题[转]

    原文地址:http://www.cnblogs.com/harleyhu/archive/2012/11/29/2794809.html 1.在father定义的方法若含有virtual关键字,chi ...

  3. Java继承和接口

    接口最关键的作用,也是使用接口最重要的一个原因:能上溯造型至多个基础类.使用接口的第二个原因与使用抽象基础类的原因是一样的:防止客户程序员制作这个类的一个对象,以及规定它仅仅是一个接口.这样便带来了一 ...

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

    一.继承 1.1.继承概念 将对象的共性抽取出来.提取出一个单独的类. 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一 ...

  5. java 类的继承和接口的继承

    父类 public class person { String name; int age; void eat(){ System.out.println("吃饭"); } voi ...

  6. Effective C++ 笔记:条款 34 实现继承和接口继承

    Differentiate between inheritance of interface and inheritance of implementation. 行为含义 声明一个pure virt ...

  7. 【C# 复习总结】类、继承和接口

    1 类 定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指 ...

  8. Javascript面向对象特性实现封装、继承、接口详细案例

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  9. java基础知识总结--继承和接口

    什么是继承?什么是接口?他们之间的区别和联系是什么? 什么是继承? 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能.多个类中存在相同属性和行 ...

随机推荐

  1. c# json数据解析——将字符串json格式数据转换成对象或实体类

    网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过例子由易到难总结一下处理过程,希望能帮到和我一样开始不会的朋 ...

  2. 《图解HTTP》笔记1

    Web 是建立在 HTTP 协议上通信的. HTTP 通常被译为超文本传输协议,但这种译法并不严谨.严谨的译名应该为“超文本转移协议”. 通过发送请求获取服务器资源的 Web 浏览器等,都可称为客户端 ...

  3. 第93题:复原IP地址

    一. 问题描述 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135 ...

  4. Apache 下载+安装

    1.官网下载Apache 官网地址:https://httpd.apache.org/ 点击Download 上面那段话,大致意思:很高兴Apache服务器2.4.18版本的发布.在2.4.x的分支的 ...

  5. 【线性代数】6-1:特征值介绍(Introduction to Eigenvalues)

    title: [线性代数]6-1:特征值介绍(Introduction to Eigenvalues) categories: Mathematic Linear Algebra keywords: ...

  6. element-ui遮罩层el-dialog的使用

    template <el-button type="text" @click="dialogVisible = true">点击打开 Dialog& ...

  7. MongoDB-python操作mongodb

    安装 pip install pymongo 连接mongodb from pymongo import MongoClient my_client = MongoClient("127.0 ...

  8. 2019-2020 ICPC, NERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred)

    这是一场三人组队赛来的,单人带电子模板不限时单挑试一下.按照难度排序. B - Balls of Buma 题意:玩祖玛,射入任意颜色的球一个,当某段长度变长了且长度变长后>=3则这段就会消除, ...

  9. 2015-2016 ACM ICPC Baltic Selection Contest

    这是上礼拜三的训练赛,以前做过一次,这次仅剩B题没补.题目链接:https://vjudge.net/contest/153192#overview. A题,水题. C题,树形DP,其实是一个贪心问题 ...

  10. python异常链

    习惯使用java开发,在java开发里有异常链概念和重新抛出异常,在python是怎么实现的呢? 1.异常链 1.1.java实现 public static void test1() throws ...