3.2 类的继承与重写 – 《简单易懂的Dart》

3.2.1 继承

Dart与JavaScript之间最大的不同,恐怕就是面向对象的实现形式,在JavaScript中实现继承相当复杂并且容易出现错误.

在Dart中,进行对象继承只需要关键字extends.

我们把3.1中实现的Person类进行继承,创造一个名为Boy的子类:

class Person{  
  String firstName,lastName;
  int age;

  Person(this.firstName,this.lastName,this.age);

  String getFullName(){
    return '${firstName} ${lastName}';
  }
}

class Boy extends Person{  
  Boy(firstName,lastName,age):super(firstName,lastName,age);
}

void main(){  
  Boy john=new Boy('John','Lennon',10);
  print(john.getFullName());
}

上面这段代码中,我们使用extends继承了Person类,其子类Boy拥有父类Person的全部属性和方法.

在Boy中有一个同名方法Boy,这是Boy类的构造函数.

:super(firstName,lastName,age)的作用是将构造函数的参数传给父类,这里的super就是父类Person的指针.

按下Ctrl+R运行程序,输出John Lennon.

3.2.2 添加新成员

给子类添加一个新成员与给一个全新的类添加新成员是没有区别的,直接在类中编写成员就可以.

现在我们给Boy类增加一个成员属性hobby以及成员方法introduction.

class Boy extends Person{  
  String hobby;

  Boy(firstName,lastName,age,hobby):super(firstName,lastName,age){
    this.hobby=hobby;
  }

  void introduction(){
    print('I am $firstName $lastName, I love $hobby.');
  }
}

然后让这个叫做John的男孩做自我介绍:

void main(){  
  Boy john=new Boy('John','Lennon',10,'playing basketball');
  john.introduction();
}

输出I am John Lennon, I love playing basketball.

3.2.3 重写父类成员

重写父类成员依然非常简单,只需要使用同名的成员属性/变量将其覆盖即可.

我们重写Person类中的getFullName()方法(顺便给introduction()方法做了点小修改):

class Boy extends Person{  
  String hobby;

  Boy(firstName,lastName,age,hobby):super(firstName,lastName,age){
    this.hobby=hobby;
  }

  void introduction(){
    print('I am ${getFullName()}, I love $hobby.');
  }

  String getFullName(){
    return '$firstName-$lastName';
  }
}

现在使用同一段代码让John做一回自我介绍,输出结果为I am John-Lennon, I love playing basketball.

3.2.4 关于重载方法

Dart并不支持重载方法,重载方法常常被诟病,我们推荐使用默认值参数和var类型来更灵活的使用方法.

另外,Dart支持重载运算符,在下一节中将会作说明.