继承

继承在Nim中是完全可选的。对象需要用运行时类型信息使用继承 要使用运行时类型信息启用继承,对象需要从 RootObj 继承。 这可以直接完成,也可以通过从继承自 RootObj 的对象继承来间接完成。 通常,具有继承的类型也被标记为“ref”类型,即使这不是严格执行的。要在运行时检查某个对象是否属于某种类型,可以使用 of 运算符。

  1. type
  2. Person = ref object of RootObj
  3. name*: string # *表示 `name`可以从其它模块访问
  4. age: int # 没有*表示字段对其它模块隐藏
  5.  
  6. Student = ref object of Person # Student从Person继承
  7. id: int # 有一个id字段
  8.  
  9. var
  10. student: Student
  11. person: Person
  12. assert(student of Student) # is true
  13. # 对象构造:
  14. student = Student(name: "Anton", age: 5, id: 2)
  15. echo student[]

继承是使用 object of 语法完成的。目前不支持多重继承。如果一个对象类型没有合适的祖先, RootObj 可以用作它的祖先,但这只是一个约定。 没有祖先的对象是隐式的“final”。你可以使用 inheritable 编译指示来引入除 system.RootObj 之外的新对象根。 (例如,GTK封装使用了这种方法。)

只要使用继承,就应该使用Ref对象。它不是必须的,但是对于非ref对象赋值,例如 let person:Person = Student(id:123) 将截断子类字段。

注意 :对于简单的代码重用,组合(has-a 关系)通常优于继承(is-a 关系)。由于对象是Nim中的值类型,因此组合与继承一样有效。