class Color { static const red = const Color('red'); // 一个恒定的静态变量 final String name; // 一个实例变量。 const Color(this.name); // 一个恒定的构造函数。 } main() { assert(Color.red.name == 'red'); }
静态方法, 静态方法(类方法)不在一个实例上进行操作,因而不必访问 this 。例如:
import 'dart:math'; class Point { num x; num y; Point(this.x, this.y); static num distanceBetween(Point a, Point b) { var dx = a.x - b.x; var dy = a.y - b.y; return sqrt(dx * dx + dy * dy); } } main() { var a = new Point(2, 2); var b = new Point(4, 4); var distance = Point.distanceBetween(a, b); assert(distance < 2.9 && distance > 2.8); }
注:考虑到使用高阶层的方法而不是静态方法,是为了常用或者广泛使用的工具和功能。
你可以将静态方法作为编译时常量。例如,你可以把静态方法作为一个参数传递给静态构造函数。
抽象类使用 abstract 修饰符来定义一个抽象类,该类不能被实例化。抽象类在定义接口的时候非常有用,实际上抽象中也包含一些实现。如果你想让你的抽象类被实例化,请定义一个 工厂构造函数 。
抽象类通常包含 抽象方法。下面是声明一个含有抽象方法的抽象类的例子:
// 这个类是抽象类,因此不能被实例化。 abstract class AbstractContainer { // ...定义构造函数,域,方法... void updateChildren(); // 抽象方法。 }
下面的类不是抽象类,因此它可以被实例化,即使定义了一个抽象方法:
class SpecializedContainer extends AbstractContainer { // ...定义更多构造函数,域,方法... void updateChildren() { // ...实现 updateChildren()... } // 抽象方法造成一个警告,但是不会阻止实例化。 void doSomething(); }
类-隐式接口
每个类隐式的定义了一个接口,含有类的所有实例和它实现的所有接口。如果你想创建一个支持类 B 的 API 的类 A,但又不想继承类 B ,那么,类 A 应该实现类 B 的接口。
一个类实现一个或更多接口通过用 implements 子句声明,然后提供 API 接口要求。例如:
// 一个 person ,包含 greet() 的隐式接口。 class Person { // 在这个接口中,只有库中可见。 final _name; // 不在接口中,因为这是个构造函数。 Person(this._name); // 在这个接口中。 String greet(who) => 'Hello, $who. I am $_name.'; } // Person 接口的一个实现。 class Imposter implements Person { // 我们不得不定义它,但不用它。 final _name = ""; String greet(who) => 'Hi $who. Do you know who I am?'; } greetBob(Person person) => person.greet('bob'); main() { print(greetBob(new Person('kathy'))); print(greetBob(new Imposter())); }
这里是具体说明一个类实现多个接口的例子:
class Point implements Comparable, Location { // ... }
类-扩展一个类使用 extends 创建一个子类,同时 supper 将指向父类: