您的位置:首页 > 其它

浅谈 Nim 中的“接口”

2015-11-30 22:08 211 查看
本篇文章是作者在看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 接口。有兴趣的同学可以看看。

本篇文章是作者在看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 接口。有兴趣的同学可以看看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: