编程语言
452
方法指那些为一个对象提供行为的函数。
实例方法
对象上的实例方法可以访问实例变量和 this。下面代码中的 distanceTo() 方法就是一个实例方法的例子:
import 'dart:math'; class Point { num x, y; Point(this.x, this.y); num distanceTo(Point other) { var dx = x - other.x; var dy = y - other.y; return sqrt(dx * dx + dy * dy); } }
Getters 和 setters
Getters 和 setters 是为一个对象的属性提供读写权限的特殊方法。回想每一个实例变量都有一个隐式的 getter,符合条件的还会有一个 setter。你可以通过实现 getters 和 setters 创建额外的属性,使用 get 和 set 关键词:
class Rectangle { num left, top, width, height; Rectangle(this.left, this.top, this.width, this.height); // 定义两个计算属性:right 和 bottom num get right => left + width; set right(num value) => left = value - width; num get bottom => top + height; set bottom(num value) => top = value - height; } void main() { var rect = Rectangle(3, 4, 20, 15); assert(rect.left == 3); rect.right = 12; assert(rect.left == -8); }
通过 getters 和 setters,你可以从实例变量起步,之后使用方法封装它们,整个过程不需要修改代码。
说明:无论是否明确定义 getter,像自增 (++) 这样的表达式都会以预期的方式执行。为避免任何非预期的副作用,运算符只会调用 getter 一次,然后保存它的值到一个临时变量中。
抽象方法
实例方法、getter 和 setter 都可以是抽象的,这样即定义了一个接口但是把它的实现留给其他类。抽象方法只能存在于 抽象类 中。
要使一个方法变得抽象,使用分号 (;) 代替方法体:
abstract class Doer { // 定义实例变量和方法... void doSomething(); // 定义一个抽象方法 } class EffectiveDoer extends Doer { void doSomething() { // 提供一个实现,所以该方法在这里不是抽象的 } }