浅谈 Nim 中的“接口”
2015-11-30 22:08
211 查看
本篇文章是作者在看Nim 标准库源码时受到启发而写的,在Nim 官网的教程和手册上没有找到interface的相关说明,“接口” 这个说法是从Java类比过来的,现在还不能确定Nim 是否有接口,但interface在Nim中是保留关键字。
下面是我写的一段代码:
在上面的程序中type定义了一个“接口”,Person是类PersonObj的引用,PersonObj中有两个过程,分别是speakImpl和eatImpl,这两个就相当与Java中的接口方法,下面定义的两个类型Chinese和American分别实现了这个“接口”。过程newChinese和newAmerican的作用是对“接口”中的过程的实现,最后我们的对象能够调用经过封装的“接口”的过程。其实我们也可以可以直接调用“接口”中的过程,而不需要封装成showSpeak和showEat。例如:
你也可以不使用引用类型,直接用一个类,下面的这段代码也是可以的:
这里并没有像Java那样有关键字interface标记,当然,你也可以把Chinese 、American 和测试文件写在不同的文件里。这是在看的标准库 Nim\lib\pure\streams 里看到的,源码介绍说是提供了 stream 接口。有兴趣的同学可以看看。
本篇文章是作者在看Nim 标准库源码时受到启发而写的,在Nim 官网的教程和手册上没有找到interface的相关说明,“接口” 这个说法是从Java类比过来的,现在还不能确定Nim 是否有接口,但interface在Nim中是保留关键字。
下面是我写的一段代码:
在上面的程序中type定义了一个“接口”,Person是类PersonObj的引用,PersonObj中有两个过程,分别是speakImpl和eatImpl,这两个就相当与Java中的接口方法,下面定义的两个类型Chinese和American分别实现了这个“接口”。过程newChinese和newAmerican的作用是对“接口”中的过程的实现,最后我们的对象能够调用经过封装的“接口”的过程。其实我们也可以可以直接调用“接口”中的过程,而不需要封装成showSpeak和showEat。例如:
你也可以不使用引用类型,直接用一个类,下面的这段代码也是可以的:
这里并没有像Java那样有关键字interface标记,当然,你也可以把Chinese 、American 和测试文件写在不同的文件里。这是在看的标准库 Nim\lib\pure\streams 里看到的,源码介绍说是提供了 stream 接口。有兴趣的同学可以看看。
下面是我写的一段代码:
type Person* = ref PersonObj PersonObj* = object of RootObj speakImpl*: proc (p: Person) eatImpl*: proc (p: Person) proc showSpeak*(p: Person) = p.speakImpl(p) proc showEat*(p: Person) = p.eatImpl(p) type Chinese* = ref ChineseObj ChineseObj* = object of Person proc Cspeak*(p: Person) = echo ("你好") proc Ceat*(p: Person) = echo ("馒头") proc newChinese*(): Chinese = new(result) result.speakImpl = Cspeak result.eatImpl = Ceat type American* = ref AmericanObj AmericanObj* = object of PersonObj proc Aspeak*(p: Person) = echo ("Hello") proc Aeat*(p: Person) = echo ("hamburger") proc newAmerican*(): American = new(result) result.speakImpl = Aspeak result.eatImpl = Aeat var varC = newChinese() varA = newAmerican() varC.showSpeak() varA.showSpeak() varC.showEat() varA.showEat()
在上面的程序中type定义了一个“接口”,Person是类PersonObj的引用,PersonObj中有两个过程,分别是speakImpl和eatImpl,这两个就相当与Java中的接口方法,下面定义的两个类型Chinese和American分别实现了这个“接口”。过程newChinese和newAmerican的作用是对“接口”中的过程的实现,最后我们的对象能够调用经过封装的“接口”的过程。其实我们也可以可以直接调用“接口”中的过程,而不需要封装成showSpeak和showEat。例如:
varC.speakImpl(varC) varA.speakImpl(varA) varC.eatImpl(varC) varA.eatImpl(varA)
你也可以不使用引用类型,直接用一个类,下面的这段代码也是可以的:
type Person* = object of RootObj speak*: proc (p: Person) eat*: proc (p: Person) proc showSpeak*(p: Person) = p.speak(p) proc showEat*(p: Person) = p.eat(p) type Chinese* = object of Person proc Cspeak*(p: Person) = echo ("你好") proc Ceat*(p: Person) = echo ("馒头") proc newChinese*(): Chinese = result.speak = Cspeak result.eat = Ceat type American* = object of Person proc Aspeak*(p: Person) = echo ("Hello") proc Aeat*(p: Person) = echo ("hamburger") proc newAmerican*(): American = result.speak = Aspeak result.eat = Aeat var varC = newChinese() varA = newAmerican() varC.showSpeak() varA.showSpeak() varC.showEat() varA.showEat()
这里并没有像Java那样有关键字interface标记,当然,你也可以把Chinese 、American 和测试文件写在不同的文件里。这是在看的标准库 Nim\lib\pure\streams 里看到的,源码介绍说是提供了 stream 接口。有兴趣的同学可以看看。
本篇文章是作者在看Nim 标准库源码时受到启发而写的,在Nim 官网的教程和手册上没有找到interface的相关说明,“接口” 这个说法是从Java类比过来的,现在还不能确定Nim 是否有接口,但interface在Nim中是保留关键字。
下面是我写的一段代码:
type Person* = ref PersonObj PersonObj* = object of RootObj speakImpl*: proc (p: Person) eatImpl*: proc (p: Person) proc showSpeak*(p: Person) = p.speakImpl(p) proc showEat*(p: Person) = p.eatImpl(p) type Chinese* = ref ChineseObj ChineseObj* = object of Person proc Cspeak*(p: Person) = echo ("你好") proc Ceat*(p: Person) = echo ("馒头") proc newChinese*(): Chinese = new(result) result.speakImpl = Cspeak result.eatImpl = Ceat type American* = ref AmericanObj AmericanObj* = object of PersonObj proc Aspeak*(p: Person) = echo ("Hello") proc Aeat*(p: Person) = echo ("hamburger") proc newAmerican*(): American = new(result) result.speakImpl = Aspeak result.eatImpl = Aeat var varC = newChinese() varA = newAmerican() varC.showSpeak() varA.showSpeak() varC.showEat() varA.showEat()
在上面的程序中type定义了一个“接口”,Person是类PersonObj的引用,PersonObj中有两个过程,分别是speakImpl和eatImpl,这两个就相当与Java中的接口方法,下面定义的两个类型Chinese和American分别实现了这个“接口”。过程newChinese和newAmerican的作用是对“接口”中的过程的实现,最后我们的对象能够调用经过封装的“接口”的过程。其实我们也可以可以直接调用“接口”中的过程,而不需要封装成showSpeak和showEat。例如:
varC.speakImpl(varC) varA.speakImpl(varA) varC.eatImpl(varC) varA.eatImpl(varA)
你也可以不使用引用类型,直接用一个类,下面的这段代码也是可以的:
type Person* = object of RootObj speak*: proc (p: Person) eat*: proc (p: Person) proc showSpeak*(p: Person) = p.speak(p) proc showEat*(p: Person) = p.eat(p) type Chinese* = object of Person proc Cspeak*(p: Person) = echo ("你好") proc Ceat*(p: Person) = echo ("馒头") proc newChinese*(): Chinese = result.speak = Cspeak result.eat = Ceat type American* = object of Person proc Aspeak*(p: Person) = echo ("Hello") proc Aeat*(p: Person) = echo ("hamburger") proc newAmerican*(): American = result.speak = Aspeak result.eat = Aeat var varC = newChinese() varA = newAmerican() varC.showSpeak() varA.showSpeak() varC.showEat() varA.showEat()
这里并没有像Java那样有关键字interface标记,当然,你也可以把Chinese 、American 和测试文件写在不同的文件里。这是在看的标准库 Nim\lib\pure\streams 里看到的,源码介绍说是提供了 stream 接口。有兴趣的同学可以看看。
相关文章推荐
- date转String
- 使用指针的方式遍历图像数据
- 什么是对象?
- 20135310陈巧然家庭作业汇总[3.56 3.67 6.23 6.39.6.40 6.41]
- 欢迎使用CSDN-markdown编辑器
- 值得深思:美国感恩节78.3%的网购来自iOS
- git常用命令及技巧
- 特征表达——统计、hash、embedding
- 浅谈 Nim 中的“接口”
- JAVAWEB之自定义TAG开发二
- 终极解释: java方法传递参数的方式
- 第二个Sprint ------第四、五、六、七天
- 黑马程序员--集合框架(collection)
- 如何做一个匀速旋转的轮子
- 容器总结——无序容器
- 常用内部排序算法之一:归并排序
- Android常用控件之进度条(Progressbar)
- android 音视频直播
- jsp 百度编辑器配置 整合springmvc注意细节
- 快速排序--quickSort