📜  Dart – Super 和 This 关键字(1)

📅  最后修改于: 2023-12-03 15:14:36.226000             🧑  作者: Mango

Dart - Super 和 This 关键字

在 Dart 中,superthis 关键字可以被用来引用父类的成员和当前类的成员。本文将介绍这两个关键字的用法和示例。

Super 关键字

super 关键字用来引用父类的成员,包括字段、方法和构造函数。它有两种用法:

引用父类的字段或方法

在子类中,可以使用 super 关键字来引用父类的字段或方法,如下所示:

class Person {
  String name = "John";

  void sayHello() {
    print("Hello, I'm $name");
  }
}

class Student extends Person {
  void introduce() {
    print("My name is $name"); // 引用父类的字段
    super.sayHello(); // 调用父类的方法
  }
}

void main() {
  var student = new Student();
  student.introduce();
}

输出:

My name is John
Hello, I'm John
调用父类的构造函数

在子类的构造函数中,可以使用 super 关键字来调用父类的构造函数。如果子类没有显式调用父类的构造函数,则默认调用父类的无参构造函数。示例代码如下:

class Person {
  String name;

  Person(this.name);
}

class Student extends Person {
  int grade;

  Student(String name, this.grade) : super(name);
}

void main() {
  var student = new Student("John", 8);
  print("${student.name} is in ${student.grade}th grade");
}

输出:

John is in 8th grade
This 关键字

this 关键字用来引用当前类的成员,包括字段、方法和构造函数。它也有两种用法:

引用当前类的字段或方法

在类的方法中,可以使用 this 关键字来引用这个类的字段或方法,如下所示:

class Person {
  String name;

  Person(this.name);

  void introduce() {
    print("My name is $name");
  }
}

void main() {
  var person = new Person("John");
  person.introduce();
}

输出:

My name is John
调用当前类的构造函数

在一个构造函数中,可以使用 this 关键字来调用当前类的其他构造函数。这个构造函数必须是这个类的其他构造函数的直接或间接调用。示例代码如下:

class Person {
  String name;

  Person(this.name);

  Person.fromAge(int age) : this("Unknown${age.toString()}");

  void introduce() {
    print("My name is $name");
  }
}

void main() {
  var person1 = new Person("John");
  person1.introduce();

  var person2 = new Person.fromAge(30);
  person2.introduce();
}

输出:

My name is John
My name is Unknown30
总结

superthis 关键字可以让我们方便地访问父类或当前类的成员,提高了代码的可读性和可维护性。在使用时,需要注意一些特殊的细节,如不要在构造函数之外使用 this 关键字等。