3.4 隐式接口与GetSet方法 – 《简单易懂的Dart》

3.4.1 隐式接口

接口是更纯粹的抽象,使用接口时必须实现其定义的所有成员.

Dart提供了隐式接口的功能,在定义类时使用implements关键字,可以像extends一样从父类获取到成员,与extends不同的是,这不是继承,而是接口成员约束.

复制以下代码并运行:

class Player{  
  int health_point;

  Player(this.health_point);

  void loseHealthPoint(int point){
    health_point-=point;
  }
  void restoreHealthPoint(int point){
    health_point+=point;
  }
}

class Backpack{  
  Map content;

  Backpack.fromJSON(this.content);
}

class Bob implements Player,Backpack{  
  int health_point=100;
  Map content={'potion':2};

  void loseHealthPoint(int point){
    health_point-=2*point;
  }

  void restoreHealthPoint(int point){
    health_point+=point~/2;
  }

  void usePotion(){
    content['potion']--;
    restoreHealthPoint(10);
  }
}

void main(){  
  Bob bob=new Bob();
  print(bob.health_point);
  bob.loseHealthPoint(20);
  print(bob.health_point);
  bob.usePotion();
  print(bob.health_point);
}

刚刚发生了什么?

代码中有一个Player类和Backpack类,它们是可以单独使用的.

然后我们定义了一个Bob类,它是一个接口,其成员约束来自于Player类和Backpack类,所以需要在Bob类中实现Player类和Backpack类的成员.

Bob依然处于中毒状态(详见3.3 类的抽象与运算符重载),所以它受伤时会受到2倍伤害,回复则只有一半的效果.

运行程序时,Bob失去了40点HP,调用usePoint后,消耗一个药水,HP恢复了5点.

3.4.2 get和set

在传统OOP中,名为getXXX和setXXX的方法非常常见,多使用于访问私有成员变量,提供预处理等等.

Dart提供了set和get关键字帮助我们更高效的访问成员变量.

比如,将Player类的加减血方法转化为getters和setters:

class Player{  
  int health_point;

  int get hp{
    return health_point;
  }
      set hp(int value){
    health_point+=value;
  }

  Player(this.health_point);
}

现在,get变量hp时会返回healthpoint的值,set变量hp时会将数值加在healthpoint上.

void main(){  
  Player bob=new Player(100);
  print(bob.hp);
  bob.hp=-10;
  print(bob.hp);
  bob.hp=10;
  print(bob.hp);
}

像这样使用就可以了.

如果你还记得2.6 函数中介绍过的第一类函数,Player类还可以简写成这样:

class Player{  
  int health_point;

  int get hp            => health_point;
      set hp(int value) => health_point+=value;

  Player(this.health_point);
}