方法
过程总是静态派发,而方法则使用动态派发。为了将动态派发应用在对象上,对象必须是引用类型。
type
Expression = ref object of RootObj ## 表达式的抽象基类
Literal = ref object of Expression
x: int
PlusExpr = ref object of Expression
a, b: Expression
method eval(e: Expression): int {.base.} =
# 一定要重写这个基方法
raise newException(CatchableError, "未重写基方法")
method eval(e: Literal): int = return e.x
method eval(e: PlusExpr): int =
# 注意: 这里依赖于动态绑定
result = eval(e.a) + eval(e.b)
proc newLit(x: int): Literal =
new(result)
result.x = x
proc newPlus(a, b: Expression): PlusExpr =
new(result)
result.a = a
result.b = b
echo eval(newPlus(newPlus(newLit(1), newLit(2)), newLit(4)))
在这个例子中,构造函数 newLit 和 newPlus 都是过程,因为它们都使用静态绑定,但是 eval 是方法因为需要动态绑定。
正如这个例子所示,基方法必须使用 base 编译指示修饰。base 编译指示对于开发者来说也是一种提醒: 这个基方法 m 是推断方法 m 所能产生的所有效果的一个基础。
注意: 目前还不支持方法的编译期执行。
注意: 从 Nim 0.20 开始,泛型方法已被弃用。
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .