Nim语言OOP

声明一个struct:

type
    Vector2D* = object
        x*, y*: float32

名字后面带星号就是对module外public, 不带星号就是private.

要创建一个Vector2D: vec = Vector2D(x: 0, y: 0)

object前加上ref就从值拷贝变成了引用拷贝:

type
    Image* = ref object
        texture*: uint
        width*, height*: int

ref相当于指针. 解引用的符号是一对方括号: image[] , 不过访问成员属性时不用写image[].width, 可以直接用句号: image.width

定义成员函数:

proc len*(vec: Vector2D): float32 {.inline.} =
    sqrt(vec.x * vec.x + vec.y * vec.y)

可以写 len(vec) , 也可以vec.len()

操作符重载:

proc `+`*(lf, rt: Vector2D): Vector2D {.inline.} =
    result.x = lf.x + rt.x
    result.y = lf.y + rt.y

操作符用一对``括起来.

可以写vec1 + vec2, 也可以强行写成函数调用的形式`+`(vec1, vec2)

创建基类:

type
    Graph2D* = ref object of RootObj
        position*: Vector2D
        direction*: float32

基类要继承RootObj, 或者注上{.inheritable.}的pragma, 否则默认为final.

继承:

type
    Circle* = ref object of Graph2D
        radius*: float32

Nim本身没构造函数这种东西, 可以自己写一个:

proc initCircle*(c: Circle, radius: float32) =
    initGraph2D(c)
    c.radius = radius

proc newCircle*(radius: float32): Circle =
    new(result)
    initCircle(result, radius)

除了newCircle外还特地加了一个initCircle, 毕竟父类的构筑函数不会被自动调用, 需要手动用initXXX进行对象初始化.

运行时类型判断可以用of:

proc isCircle(g: Graph2D): bool = g of Circle

虚函数:

method isPointIn*(self: Circle, x, y: float32): bool =
    let
        detX = self.position.x - x
        detY = self.position.y - y
        r = self.radius
    return detX * detX + detY * detY <= r * r

不过Nim实际上不会创建一个虚方法表, 而是创建dispatch trees.

时间: 2024-10-28 10:26:31

Nim语言OOP的相关文章

Nim语言的模块化编程

前言 Nim支持把一大段程序分成若干个模块 一个模块就是一个源代码文件 每个模块都拥有它自己的名称空间 模块化可以起到封装(信息隐藏)和分步编译的作用 一个模块可以通过import语句获得另一个模块的符号 nim语言允许模块间的循环引用, 只有用星号(*)标记的顶级符号才会被导出给其他模块. 模块名和文件名相同,模块名的命名方式和nim编程语言的标识符命名方式相同 编译器编译模块的规则如下: 按照import的导入顺序,编译模块 如果存在循环引用,那么就只导入顶级符号(已解析的符号),如果编译器

微软C#6.0语言OOP面向对象编程》《微软ASP.NET\MVC56网站开发》《微软Web服务\WCF\Web API3.0课程视频》

最新<微软C#6.0语言OOP面向对象编程><微软ASP.NET\MVC56网站开发><微软Web服务\WCF\Web API3.0课程视频>下载 下载链接:http://pan.baidu.com/s/1bnjJQnd 密码:36ji 微软与开源实战训练营QQ群:  203822816微软MSDN俱乐部QQ群:  29754721,

用Nim语言开发windows GUI图形界面程序

前言 本文得到了“樂師”的大力支持, 我们一起调试程序到深夜,要是没有他的帮忙, 我不知道要多久才能迈过这道坎, 另外“归心”还有其他人也提供了帮助, 他们都来自于QQ群:“Nim开发集中营”469329878: 感兴趣的朋友,可以加这个群一起讨论 配置GUI开发环境 我在这篇博客中,写到了Nim开发环境的搭建 那篇博客中说MingW是必选的, 这对于开发一个普通的Nim程序来说,没有问题,但要开发GUI程序,还不够 官方安装包中所包含的的MingW安装包有点问题 如果你用编译命令:--app:

nim和面向对象(一)

Nim and OO 原文链接:http://goran.krampe.se/2014/10/29/nim-and-oo/ 作者:Roads less Taken A blend of programming, boats and life. 时间:2014,10,29 Nim is presented as an imperative language. And yes, it has some of its roots in the Pascal line of languages, but

Nim教程【十四】

网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在system模块中定义了异常类型的基类 所有的异常都应该派生自system.Exception类型 由于我们不清楚异常对象的生命周期, 所以必须在内存堆上为异常的实例分配空间 编译器不允许开发人员在栈上为异常分配空间 你如果想抛出一个异常,你必须为这个异常的msg属性赋值 按照约定,只有在非常特殊的情况

Nim教程【七】

这是国内第一个关于Nim的系列教程 先说废话 很开心,在今天凌晨快一点多的时候拿到了 nim-lang.com:nim-lang.cn:nim-lang.net 这三个域名,到不是为了投资,准备用nim-lang.com做一个社区出来 不知道国内有没有人或者机构打算赞助这个事情的 整型 Nim语言中有10个整型类型 int;int8;int16;int32;int64;uint;uint8;uint16;uint32;uint64 默认的整型类型是int 可以使用尾缀的方式来设置整型的类型,就像

Nim函数调用的几种形式

Nim函数调用的几种形式 Nim 转载条件:如果你需要转载本文,你需要做到完整转载本文所有的内容,不得删改文内的作者名字与链接.否则拒绝转载. 关于nim的例行介绍: Nim 是一门静态编译型的系统级编程语言,内置GC,采用像Python一样的缩进风格,Nim代码被翻译成C再编译成可执行文件. 所以nim的特点是兼具简洁,性能不错,可执行文件也比较小,跨平台,开发效率快等等特点. 如果你愿意,Nim也可以被编译成c++ .Javascript .OC之类的. nim 的官方网站: https:/

Nim教程【二】

第一篇教程1秒内就被管理员从首页踢掉了 管理员嫌内容太少,没有含金量,这次多写一些. 这应该是国内第一个关于Nim入门的系列教程 好,闲话休提,言归正传 Nim介绍 Nim代码会编译成C语言的代码,再编译成本地机器码,不依赖于虚拟机, 而且生成的可执行文件比较小,不依赖于其他库,分发起来比较方便 拥有一个“非追踪式”的垃圾收集器,这就非常适用于类似游戏这样的“弱实时”系统 让程序员拥有直接操纵内存和访问硬件的权力(手动管理的内存有别于垃圾收集器可收集的内存) 零开销的迭代器 Cross-modu

Nim教程【十五】【完结】

模版 模版是Nim语言中的抽象语法树,它是一种简单的替换机制,在编译期被处理 这个特性使Nim语言可以和C语言很好的运行在一起 像调用一个方法一样调用一个模版 请看如下代码: template `!=` (a, b: expr): expr =   # this definition exists in the System module   not (a == b) assert(5 != 6) # the compiler rewrites that to: assert(not (5 ==