Carbon语言 类与对象

Carbon 支持面向对象编程。类是 Carbon 的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类被称为类的成员。

1. 类与对象

class Point {
  var x: i32;
  var y: i32;
}
 
fn Main() -> i32 {
  var p1: Point = {.x = 1, .y = 2}; 
  var p2: auto = p1; 
  p2.x = 3;
  return p1.x - 1;
}

2. 成员变量与成员函数

class NewsAriticle {
  // 类似C++的static
  fn Make(headline: String, body_html: String) -> NewsAritcle();

  // 只读方法
  fn AsHtml[me: Self]() -> String;

  // 可修改方法
  fn Publish[addr me: Self*]() { me->published = DateTime.Now(); }

  private var headline: String;
  private var body_html: String;
  private var published: Optional(Datetime);
}

// 类外定义成员函数
fn NewsAriticle.AsHtml[me: Self]() -> String{ ... }

Carbon 中类中成员访问控制权限默认都是 public,如果需要声明成私有则需要单独加 private 关键字。这个行为和 C/C++ 的 struct 相同,但是和主流语言的 class 都不同。 定义在类中的函数,如果有[me: Self]表示是只读的成员函数,在函数中不能修改类对象的成员变量。me在函数体中是表示对当前对象的引用,类似 C++的(*this)。 如果有[addr me: Self*]表示的是可对当前对象进行修改的函数。me在函数体中类似 C++ 的 this 指针。 [me: Self]或[addr me: Self*]的成员函数,也可以称作方法(method),如果类中的函数没有[me: Self]或[addr me: Self*],则表示是一个和对象无关的函数,等价于C++中的static成员函数。这个设计很像python中的类中成员函数的设计。

Carbon只支持单继承,不支持多重继承。值得注意的是普通的class关键字定义的类型默认都是final的,即不能被继承生成子类。但 abstrct class 和 base class 关键字定义的类型可以被 ...