Menu
CoddyTech

Getter và setter

Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 21 trên 110.

Getter và setter cho phép truy cập và chỉnh sửa các trường của lớp thông qua những phương thức đặc biệt trông giống thuộc tính thông thường. Thay vì để lộ trực tiếp các trường, bạn có thể kiểm soát cách đọc và ghi giá trị.

Getter được định nghĩa bằng từ khóa get và trả về một giá trị được tính toán hoặc lưu trữ:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0
print(rect.perimeter); // 16.0

Lưu ý rằng area và perimeter được truy cập như các trường, nhưng giá trị được tính lại mỗi lần. Không cần dấu ngoặc đơn.

Setter sử dụng từ khóa set và cho phép bạn kiểm soát cách gán một giá trị:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

Hàm setter xác thực đầu vào trước khi lưu và thậm chí có thể chuyển đổi giữa các đơn vị. Nhờ vậy, bạn kiểm soát được dữ liệu mà vẫn giữ cú pháp gọn gàng như thuộc tính cho người dùng lớp của bạn.

challenge icon

Thử thách

Dễ

Hãy tạo chương trình theo dõi điểm số cho trò chơi, sử dụng getter và setter để quản lý thống kê người chơi với tính năng xác thực và giá trị được tính toán.

Bạn sẽ sắp xếp code vào hai tệp:

  • player.dart: Định nghĩa lớp Player để theo dõi thành tích của người chơi trong trò chơi. Lớp của bạn cần có:
    • Trường String name để lưu tên người chơi
    • Trường riêng tư int _score, bắt đầu từ 0
    • Trường riêng tư int _lives, bắt đầu từ 3
    • Một hàm khởi tạo nhận tên người chơi
    • Getter score trả về điểm số hiện tại
    • Setter score chỉ chấp nhận giá trị từ 0 trở lên (bỏ qua giá trị âm)
    • Getter lives trả về số mạng hiện tại
    • Setter lives chỉ chấp nhận giá trị từ 0 đến 5, bao gồm cả hai đầu (bỏ qua giá trị ngoài phạm vi này)
    • Getter level tính cấp độ của người chơi dựa trên điểm số: lấy điểm số chia cho 100 (phép chia lấy số nguyên), rồi cộng thêm 1
    • Getter isAlive trả về true nếu số mạng lớn hơn 0
    • Phương thức displayStatus() in ra trạng thái hiện tại của người chơi
  • main.dart: Nhập lớp người chơi và minh họa cách dùng getter và setter:
    • Tạo một người chơi có tên 'Alex'
    • Đặt điểm số thành 250 rồi gọi displayStatus()
    • Thử đặt điểm số thành -50 (giá trị này sẽ bị bỏ qua) rồi gọi displayStatus()
    • Đặt số mạng thành 1 rồi gọi displayStatus()
    • Thử đặt số mạng thành 10 (giá trị này sẽ bị bỏ qua) rồi gọi displayStatus()

Phương thức displayStatus() cần in ra theo đúng định dạng sau:

[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]

Đầu ra dự kiến:

Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true

Tự làm thử

import 'player.dart';

void main() {
  // TODO: Tạo một người chơi tên 'Alex'

  // TODO: Đặt điểm số thành 250 và gọi displayStatus()

  // TODO: Thử đặt điểm số thành -50 (giá trị này sẽ bị bỏ qua) và gọi displayStatus()

  // TODO: Đặt số mạng thành 1 và gọi displayStatus()

  // TODO: Thử đặt số mạng thành 10 (giá trị này sẽ bị bỏ qua) và gọi displayStatus()
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Dart online