浅谈 Nim 中的“接口”


      本篇文章是作者在看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 接口。有兴趣的同学可以看看。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值