クラス – Dart逆引きリファレンス

2012.04.20

クラス(Classes)

クラスを定義したい

JavaScriptと異なり、「class」キーワードを使用して定義します。

class Person {
…
}

インタフェースの定義には「interface」キーワードを用います。

interface Greeter {
  String greet();
}

インタフェースを実装する際には「implements」キーワードを用います。Javaと同じですね。

class Person implements Greeter {
  String name;
  String greet() => 'Hello, my name is $name';
}

パラメータ付きのコンストラクタを定義したい

コンストラクタはクラスと同名の関数として定義します。その関数に引数を用意します。

class Person implements Greeter {
  String name;
  Person(name) {
    this.name = name;
  }
  String greet() => 'Hello, my name is $name';
}

引数自身を「this.~」とすることで、インスタンス変数への代入処理を省略することができます。

class Person implements Greeter {
  String name;
  Person(this.name);
  String greet() => 'Hello, my name is $name';
}

インスタンスを生成したい

お馴染みの「new」キーワードでインスタンス生成を行います。

Person person = new Person();

リフレクションを利用したい

現在のところリフレクションは提供されていません。間もなくサポートされるとのことです。

オブジェクトの型をチェックしたい

is」キーワードを利用します。

var person = new Person();
person is Greeter; // == true
person is! Person; // == false

サブクラスを定義したい

extends」キーワードを使用してクラスの継承を行います。

interface Greeter {
  String greet();
}

class Person implements Greeter {
  String name;
  Person(this.name);
  String greet() => 'Hello, my name is $name';
}

class Employee extends Person {
  int salary;
  Employee(name, this.salary) : super(name);
  grantRaise(num percent) {
    salary = (salary * percent).toInt();
  }
}

演算子をオーバーロードしたい

operator」キーワードを使用して演算子をオーバーロードします。

class Point {
  var x, y;
  Point(this.x, this.y);
  
  operator + (Point p) => new Point(x + p.x, y + p.y);
  
  toString() => 'x:$x, y:$y';
}

main() {
  var p1 = new Point(1, 1);
  var p2 = new Point(2, 2);
  var p3 = p1 + p2;
  print(p3); // x:3, y:3
}

備考

Employeeのコンストラクタを以下のように記述すると警告が出てしまいます。

Employee(name, this.salary) {
    super(name); // "Person" is not a function.
  }

Employee(name, this.salary) : super(name);」と記述する理由をもう少し調べてみようと思います。
Dartのコンストラクタについて調べてみました。m(_ _)m

親クラスのコンストラクタを呼び出す際はイニシャライザとして記述する必要があるとのことです。