[Dart] Từ khoá super

[Dart] Từ khoá super

Trong Dart, từ khóa super được sử dụng để tham chiếu đến lớp cha (superclass) của một lớp con (subclass). Nó cho phép bạn:

  1. Gọi constructor của lớp cha.
  2. Gọi các phương thức hoặc thuộc tính của lớp cha đã bị lớp con ghi đè (override).

1. Gọi constructor của lớp cha

Khi lớp con kế thừa từ lớp cha, bạn có thể sử dụng super để gọi constructor của lớp cha nhằm khởi tạo các thuộc tính hoặc thực hiện logic ban đầu.

class Animal {
  String name;

  // Constructor của lớp cha
  Animal(this.name);
}

class Dog extends Animal {
  String breed;

  // Constructor của lớp con gọi constructor lớp cha bằng super
  Dog(String name, this.breed) : super(name);

  void display() {
    print('Name: $name, Breed: $breed');
  }
}

void main() {
  Dog dog = Dog('Buddy', 'Golden Retriever');
  dog.display(); // Output: Name: Buddy, Breed: Golden Retriever
}
Dart

Giải thích:

  • Constructor của Dog nhận tham số namebreed.
  • super(name) gọi constructor của lớp Animal để khởi tạo thuộc tính name.

2. Gọi phương thức hoặc thuộc tính của lớp cha

Khi lớp con ghi đè (override) một phương thức hoặc thuộc tính của lớp cha, bạn vẫn có thể gọi phiên bản của lớp cha bằng cách sử dụng super.

Ví dụ:

class Animal {
  void sound() {
    print('Animal makes a sound');
  }
}

class Dog extends Animal {
  @override
  void sound() {
    super.sound(); // Gọi phương thức của lớp cha
    print('Dog barks');
  }
}

void main() {
  Dog dog = Dog();
  dog.sound();
  // Output:
  // Animal makes a sound
  // Dog barks
}
Dart

Giải thích:

  • Lớp Dog ghi đè phương thức sound() của lớp Animal.
  • Trong phương thức sound() của Dog, super.sound() gọi phiên bản của lớp cha trước khi thực thi logic bổ sung.

3. Khi nào nên dùng super?

  • Khi cần khởi tạo các thuộc tính trong lớp cha từ constructor lớp con.
  • Khi muốn kế thừa nhưng vẫn giữ lại logic của lớp cha, bằng cách sử dụng phương thức hoặc thuộc tính của lớp cha.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *