对C++和Go语言中接口的理解
一直对接口没有什么概念,感觉接口就是C++中的多态。个人理解,接口的作用就是让外部调用者不用关心这个类的类型,让公用的逻辑可以重用。
一个例子:
我们说燕子会飞,会喝水。按照一般的写法,我们需要定义一个燕子的类,然后写了会飞的函数。假设有这么个流程,燕子飞到河边,喝水。这个过程中要用燕子类的指针调用。这个过程没问题,能很快搞定。
没过多久,PM需要加功能(你懂的),我们要写个鸽子飞到河边,喝水。鸽子的飞法和喝水方法与燕子自然不同。鸽子类必然要重写。但是飞到河边,喝水。这个流程能不能复用呢。因为如果我们这个流程说的是,鸟飞到河边,喝水。是不是就能够通用于燕子,鸽子,甚至是以后还可能有的喜鹊什么的。。
C++中的类继承:
在C++中,我们通常会先定义一个鸟类(基类),基类中定义了飞行,喝水等虚函数。然后,我们通过继承基类,声明了鸽子,燕子等派生类。鸽子和燕子的飞行和喝水的方法会重写掉基类中的方法(函数)。
然后,我们写这个流程时,直接使用基类来表示鸽子和燕子。在运行时,传入的类如果是燕子,就会使用燕子的飞行和喝水方法,传入的类如果是鸽子,就是鸽子的飞行和喝水方法。
以后不同的鸟类,比如喜鹊,它只需要继承自鸟类,也可以直接套到这个飞行再喝水的流程中。
这就是C++的解决方法,它让类和我们现实生活中的分类方法相对应。动物-鸟类-喜鹊,C++也可以按照这种关系组成相应的类。C++中并没有专门说明这是接口。
Go语言中的接口:
Go语言中,有专门的关键词interface来定义接口。接口中,定义了要用的函数。比如:
1
|
type Inter interface {
|
2
|
post()
|
3
|
change()
|
4
|
}
|
这就好像一个类型,它的实例是一个指针,传给这个指针的类必须包含接口中定义的方法。比如:
01
|
type PType struct {
|
02
|
x int
|
03
|
}
|
04
|
// 接收者是指针
|
05
|
func (t *PType) post() {
|
06
|
fmt.Println(t.x)
|
07
|
}
|
08
|
func (t *PType) change() {
|
09
|
t.x=5
|
10
|
}
|
为什么说接口类是一个指针类型呢,因为传递给接口实例的是地址。所以可以把它看作C++中的基类指针来使用。
1
|
//接上面的代码
|
2
|
pty := PType{4}
|
3
|
it = pty //编译失败
|
4
|
//报错:cannot use pty (type PType) as type Inter in assignment:
|
5
|
// PType does not implement Inter (change method has pointer receiver)
|
6
|
//这个意思指的是无法把PType转换为Inter类型,因为Inter需要的是pointer。
|
只要把上面第三行的 it=pty改成it=&pty即可编译通过。&是取址。
如果我定义了别的类,只需要类中有Inter接口的那几个函数,我也可以直接使用接口的实例来调用类的方法。就好像,我先定义了各种鸟类,然后我发现它们可以抽象出统一的接口,于是我把它们的共同点抽象出来,成为一个接口。
C++和Go在接口上的区别:
Go语言和C++最大的不同在于,它不需要使用基类。因为基类肯定定义在派生类之前,派生类还需要继承基类。如果基类设计的不好,那么整个代码调整起来就会很难,因为关联很多。它是一种总-分的结构,基类为总,然后分成各种派生类。
Go则是反过来,是一种分-总的机构,原本是分,再是总。各种类可以随便写。接口可以在写完类后再定义。当然,有些东西该统一的还是需要统一的。不过,接口可以最后写,而不是C++那样,必须先有基类。这增加了不少灵活性。
感觉上,C++通过派生,把共同点派生出去。而Go则是从原本的类中,提炼出共同点。
当然,C++并不是没有Go的这种特性。因为重用的这部分是偏向逻辑的。C++中认为,逻辑的重用应该和类型无关,所以它直接把逻辑也给抽象掉了。提供了一个template,即模板。模板可以直接支持各种类型。其实和Go的interface最对应的应该是模板。类的继承和操作符重载是为了让模板更方便使用(因为只有有了共同点,我们才能抽象出来)。因此C++中就没有接口这种说法。
以上是我对接口的理解。不知道对不对,如有错误望不吝赐教。
转载请注明:旅途@KryptosX » 对C++和Go语言中接口的理解
对C++和Go语言中接口的理解相关推荐
- 如何理解c语言的变量,C语言中变量的理解.PDF
C语言中变量的理解 年第 期 建建 电电 脑脑 2011 3 59 C 语言中变量的理解 潘 莉 河南经贸职业学院 东校区 河南郑州 ( 冤 450009 ) 摘 要 在很多 级语言的基础语法中都有变 ...
- c语言中*用于指针,关于C语言中指针的理解
关于c语言中指针的一些理解 这几天在看任哲老师编写的嵌入式实时操作系统uC/OS原理与应用一书,第二章讲到指针的用法,我发现自己有些地方有疑问,就重新看了关于c指针的知识.同时也对指针有了一定的理解. ...
- Java中接口的理解和使用
1.接口的理解 package com.example.demo.interfaceClass;/*** 1.我们前面用继承关系,描述了动物.哺乳动物.爬行动物的各种关系* 2.现在我们要描述:飞机. ...
- c语言中接口和函数的区别,接口与类的关系_接口函数和调用函数有什么区别
描述 接口与类的关系 类与接口是两个概念,不能混淆. 接口概念 程序接口是操作系统为用户提供的两类接口之一,编程人员在程序中通过程序接口来请求操作系统提供服务.面向过程语言最基本的单元是过程和函数. ...
- 19_09_13 关于c语言中位域的理解
在实际接触的C语言项目中,我们会发现很多时候都用到了位域.初次听到时可能有些模糊,但其实是很好理解的,以下是经过参考各类资料和大牛的说法后本人对位域的一些理解. 如有问题,欢迎告知,感谢之至. 1.什 ...
- Go语言interface(接口)的作用
示例代码 package mainimport "fmt"type Computer interface {CalculatorPlay(string) string }type ...
- c语言符号错误怎么避免,C语言中常见符号问题探析
摘 要:C语言是应用最广的高级程序设计语言,其语法灵活,使用便捷.文章在Turbo C环境下,提出几种常见的编译系统纠错无法判断的问题,分析了几种运算符.语句结束符和ELSE等,并通过案例来比较分析程 ...
- java语言中修饰一个常量_接口中定义一个常量所用的修饰符有: (5.0分)_学小易找答案...
[判断题]Java中的接口不允许被继承 (5.0分) [单选题]下列程序的输出结果是( ) public class Ex_36{ public static void main(String arg ...
- Java语言中的接口与实现
Java语言中的接口与实现 文章目录 Java语言中的接口与实现 一.实验目的: 二.实验要求: 三.提示: 四.实验小结: 一.实验目的: 1.掌握接口的设计过程: 2.理解接口中成员变量的访问权限 ...
- Go 知识点(19)— Go 语言中的野指针
野指针是一种指向内存位置是不可知的指针,一般是由于指针变量在声明时没有初始化所导致的.在 Go语言中,布尔类型的零值为 false,数值类型的零值为 0,字符串类型的零值为 "", ...
最新文章
- 活动目录实战系列二(主域控无法正常启动)
- html标记表示超链接,HTML常见标签学习
- 曾几何时,我们炼的不是丹,是特征
- 软件开发提效哪有那么容易,都是坑啊~
- linux下mysql启动和关闭
- 通过docker-composer启动容器nginx,并完成spring.boot的web站点端口转发
- 最全面计算机英语单词列表(一)
- 汇编----正确区分LJMP、AJMP、SJMP、JMP跳转指令
- “移除”虚拟机和“从磁盘中删除”虚拟机的区别
- 讯飞语音包实现Android语音合成
- 数据分析与挖掘(一)误差与精度
- MeterSphere | 超好用的开源测试平台
- W10安装Cuda和cuDNN环境
- 网管用计算机上岗证书,普通高中校园网计算机教室建设标准
- Mac系统给移动硬盘分区(图文)
- 李琦自曝女儿不是亲生 但丝毫不影响家庭的美满幸福
- 搜索引擎技术介绍(GIF图)
- 阿里云ECS服务器地域选深圳杭州还是上海?
- wegame英雄联盟服务器维护,wegame打不开英雄联盟怎么办_wegame英雄联盟打不开如何解决...
- php 汉王云名片_超弦云名片,让你彻底告别纸质名片!
热门文章
- Python opencv:实现与自己同框对话的视频特效
- 【洛谷】P1419 寻找段落
- 关于登陆百度等网站显示‘’隐私设置错误”的问题
- (附源码)Springboot人体健康检测微信小程序 毕业设计012142
- chunk的数据格式
- npm启动报错Eorror:ENOENT no such file or directory ‘/node-sass/vender‘
- 不卷了!技术团队成员集体辞职
- Seventh season eighteenth episode,Joey got an award??????
- 贝塞尔插值曲线绘制软件设计
- Spring框架学习笔记05:SpringAop