3.3 类的抽象与运算符重载 – 《简单易懂的Dart》

3.3.1 抽象

Dart的抽象关键字为abstract,只能使用在类上,不能用来修饰其成员.

抽象类不能实例化,只能在被其他类继承后才能间接的实现实例化.

用例子说话会比较方便,接下来我们规定一个名为Player(玩家)的抽象类:

abstract class Player{  
  int health_point=100;

  void loseHealthPoint(int point);
  void restoreHealthPoint(int point);
}

再编写一个特定角色Bob:

class Bob extends Player{  
  void loseHealthPoint(int point){
    health_point-=point;
  }
  void restoreHealthPoint(int point){
    health_point+=point;
  }
}

让Bob减血再加血:

Bob bob=new Bob();  
print(bob.health_point);  
bob.loseHealthPoint(10);  
print(bob.health_point);  
bob.restoreHealthPoint(10);  
print(bob.health_point);  

这段代码的意义在于,规定了抽象类,角色必须遵从这个类去实现功能,然后其他人就可以统一使用相同的接口进行编程.

现在Bob中毒了,受到两倍的伤害,并且只回复一半的血:

class Bob extends Player{  
  void loseHealthPoint(int point){
    health_point-=point*2;
  }
  void restoreHealthPoint(int point){
    health_point+=point~/2;
  }
}

比较容易理解的一个实际例子就是游戏中的职业,每个职业都有其特性,比如这个职业的人物在受到伤害时会有一定几率免疫伤害,而其他职业又没有这个特性.

更常见的情况是,在团队编程或设计公共类时使用抽象特性去定义一个接口.

3.3.2 运算符重载

Dart中可以重载以下运算符:

<+|[]
>/^[]=
<=~/&~
>=*<<==
%>>
使用operator关键字进行运算符的重载.

比如用运算符重载来模拟一个用+运算符实现的字符串连接:

class string{  
  String str;

  string(this.str);

  String operator +(string s){
    return '${str}${s.str}';
  }
}

void main(){  
  string hello=new string('Hello');
  string world=new string('World');
  print(hello+world);
}