一直对接口没有什么概念,感觉接口就是C++中的多态。个人理解,接口的作用就是让外部调用者不用关心这个类的类型,让公用的逻辑可以重用。

一个例子:

我们说燕子会飞,会喝水。按照一般的写法,我们需要定义一个燕子的类,然后写了会飞的函数。假设有这么个流程,燕子飞到河边,喝水。这个过程中要用燕子类的指针调用。这个过程没问题,能很快搞定。

没过多久,PM需要加功能(你懂的),我们要写个鸽子飞到河边,喝水。鸽子的飞法和喝水方法与燕子自然不同。鸽子类必然要重写。但是飞到河边,喝水。这个流程能不能复用呢。因为如果我们这个流程说的是,鸟飞到河边,喝水。是不是就能够通用于燕子,鸽子,甚至是以后还可能有的喜鹊什么的。。

C++中的类继承:

在C++中,我们通常会先定义一个鸟类(基类),基类中定义了飞行,喝水等虚函数。然后,我们通过继承基类,声明了鸽子,燕子等派生类。鸽子和燕子的飞行和喝水的方法会重写掉基类中的方法(函数)。

然后,我们写这个流程时,直接使用基类来表示鸽子和燕子。在运行时,传入的类如果是燕子,就会使用燕子的飞行和喝水方法,传入的类如果是鸽子,就是鸽子的飞行和喝水方法。

以后不同的鸟类,比如喜鹊,它只需要继承自鸟类,也可以直接套到这个飞行再喝水的流程中。

这就是C++的解决方法,它让类和我们现实生活中的分类方法相对应。动物-鸟类-喜鹊,C++也可以按照这种关系组成相应的类。C++中并没有专门说明这是接口。

Go语言中的接口:

Go语言中,有专门的关键词interface来定义接口。接口中,定义了要用的函数。比如:

1 type Inter interface {
2      post()
3      change()
4 }

这就好像一个类型,它的实例是一个指针,传给这个指针的类必须包含接口中定义的方法。比如:

01 type PType struct {
02      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语言中接口的理解相关推荐

  1. 如何理解c语言的变量,C语言中变量的理解.PDF

    C语言中变量的理解 年第 期 建建 电电 脑脑 2011 3 59 C 语言中变量的理解 潘 莉 河南经贸职业学院 东校区 河南郑州 ( 冤 450009 ) 摘 要 在很多 级语言的基础语法中都有变 ...

  2. c语言中*用于指针,关于C语言中指针的理解

    关于c语言中指针的一些理解 这几天在看任哲老师编写的嵌入式实时操作系统uC/OS原理与应用一书,第二章讲到指针的用法,我发现自己有些地方有疑问,就重新看了关于c指针的知识.同时也对指针有了一定的理解. ...

  3. Java中接口的理解和使用

    1.接口的理解 package com.example.demo.interfaceClass;/*** 1.我们前面用继承关系,描述了动物.哺乳动物.爬行动物的各种关系* 2.现在我们要描述:飞机. ...

  4. c语言中接口和函数的区别,接口与类的关系_接口函数和调用函数有什么区别

    描述 接口与类的关系 类与接口是两个概念,不能混淆. 接口概念 程序接口是操作系统为用户提供的两类接口之一,编程人员在程序中通过程序接口来请求操作系统提供服务.面向过程语言最基本的单元是过程和函数. ...

  5. 19_09_13 关于c语言中位域的理解

    在实际接触的C语言项目中,我们会发现很多时候都用到了位域.初次听到时可能有些模糊,但其实是很好理解的,以下是经过参考各类资料和大牛的说法后本人对位域的一些理解. 如有问题,欢迎告知,感谢之至. 1.什 ...

  6. Go语言interface(接口)的作用

    示例代码 package mainimport "fmt"type Computer interface {CalculatorPlay(string) string }type ...

  7. c语言符号错误怎么避免,C语言中常见符号问题探析

    摘 要:C语言是应用最广的高级程序设计语言,其语法灵活,使用便捷.文章在Turbo C环境下,提出几种常见的编译系统纠错无法判断的问题,分析了几种运算符.语句结束符和ELSE等,并通过案例来比较分析程 ...

  8. java语言中修饰一个常量_接口中定义一个常量所用的修饰符有: (5.0分)_学小易找答案...

    [判断题]Java中的接口不允许被继承 (5.0分) [单选题]下列程序的输出结果是( ) public class Ex_36{ public static void main(String arg ...

  9. Java语言中的接口与实现

    Java语言中的接口与实现 文章目录 Java语言中的接口与实现 一.实验目的: 二.实验要求: 三.提示: 四.实验小结: 一.实验目的: 1.掌握接口的设计过程: 2.理解接口中成员变量的访问权限 ...

  10. Go 知识点(19)— Go 语言中的野指针

    野指针是一种指向内存位置是不可知的指针,一般是由于指针变量在声明时没有初始化所导致的.在 Go语言中,布尔类型的零值为 false,数值类型的零值为 0,字符串类型的零值为 "", ...

最新文章

  1. 活动目录实战系列二(主域控无法正常启动)
  2. html标记表示超链接,HTML常见标签学习
  3. 曾几何时,我们炼的不是丹,是特征
  4. 软件开发提效哪有那么容易,都是坑啊~
  5. linux下mysql启动和关闭
  6. 通过docker-composer启动容器nginx,并完成spring.boot的web站点端口转发
  7. 最全面计算机英语单词列表(一)
  8. 汇编----正确区分LJMP、AJMP、SJMP、JMP跳转指令
  9. “移除”虚拟机和“从磁盘中删除”虚拟机的区别
  10. 讯飞语音包实现Android语音合成
  11. 数据分析与挖掘(一)误差与精度
  12. MeterSphere | 超好用的开源测试平台
  13. W10安装Cuda和cuDNN环境
  14. 网管用计算机上岗证书,普通高中校园网计算机教室建设标准
  15. Mac系统给移动硬盘分区(图文)
  16. 李琦自曝女儿不是亲生 但丝毫不影响家庭的美满幸福
  17. 搜索引擎技术介绍(GIF图)
  18. 阿里云ECS服务器地域选深圳杭州还是上海?
  19. wegame英雄联盟服务器维护,wegame打不开英雄联盟怎么办_wegame英雄联盟打不开如何解决...
  20. php 汉王云名片_超弦云名片,让你彻底告别纸质名片!

热门文章

  1. Python opencv:实现与自己同框对话的视频特效
  2. 【洛谷】P1419 寻找段落
  3. 关于登陆百度等网站显示‘’隐私设置错误”的问题
  4. (附源码)Springboot人体健康检测微信小程序 毕业设计012142
  5. chunk的数据格式
  6. npm启动报错Eorror:ENOENT no such file or directory ‘/node-sass/vender‘
  7. 不卷了!技术团队成员集体辞职
  8. Seventh season eighteenth episode,Joey got an award??????
  9. 贝塞尔插值曲线绘制软件设计
  10. Spring框架学习笔记05:SpringAop