Mục lục bài họcĐang ở d07-b2
← A-Level Computer Science
0/30 bài đã học xong
Chương 7 · Recursion, OOP and File Handling · Bài 2/3 của chương · bài 20/30 của A-Level Computer Science

Object-oriented programming

Lập trình hướng đối tượng
← Mục lục bài học
Lý thuyết · English

Class and object

A class is the template: it defines attributes (the data) and methods (the operations). An object is one instance created from that class, with its own values. A constructor runs when the object is created and sets the initial state.

Encapsulation

Attributes are declared private and reached only through public methods — getters and setters. This matters for two reasons: the class can validate every change (a setter can refuse a negative age), and the internal representation can be changed later without breaking any code that uses the class.

Inheritance

A subclass inherits the attributes and methods of its superclass and adds its own. It models an 'is a' relationship — a SavingsAccount is a BankAccount. The benefit is reuse and a single place to fix shared behaviour; the risk is that a deep hierarchy becomes hard to follow and a change high up affects everything below.

Polymorphism

A subclass can override an inherited method, and the version that runs is decided by the object's actual type. So a loop over a list of Shape objects can call Area() on each without knowing whether it is a Circle or a Rectangle. That is the real payoff of OOP: adding a new shape requires no change to the loop.

Judging OOP fairly

It suits large programs built by teams, because encapsulation limits how far a mistake can spread, and it makes code reusable. For a short script it adds structure that is not needed, and beginners often produce over-complicated hierarchies. Say which context the case describes.

Giải thích tiếng Việt

Lớp và đối tượng

Lớp là khuôn mẫu: nó định nghĩa các thuộc tính (dữ liệu) và các phương thức (thao tác). Đối tượng là một thể hiện cụ thể được tạo ra từ lớp đó, mang giá trị riêng của mình. Hàm khởi tạo chạy khi đối tượng được tạo và đặt trạng thái ban đầu.

Đóng gói

Thuộc tính được khai báo riêng tư và chỉ truy cập được qua các phương thức công khai — hàm lấy và hàm đặt. Điều này quan trọng vì hai lý do: lớp kiểm tra được tính hợp lệ của mọi thay đổi (hàm đặt có thể từ chối một số tuổi âm), và cách lưu trữ bên trong có thể đổi về sau mà không làm hỏng bất kỳ đoạn mã nào đang dùng lớp đó.

Kế thừa

Lớp con kế thừa thuộc tính và phương thức của lớp cha rồi thêm phần riêng. Nó mô hình hoá quan hệ ‘là một’ — TaiKhoanTietKiem là một TaiKhoanNganHang. Lợi ích là dùng lại mã và chỉ phải sửa hành vi dùng chung ở một chỗ; rủi ro là một cây kế thừa quá sâu thì khó theo dõi, và một thay đổi ở trên cao ảnh hưởng tới mọi thứ bên dưới.

Đa hình

Lớp con có thể ghi đè một phương thức kế thừa, và phiên bản được chạy do KIỂU THỰC TẾ của đối tượng quyết định. Nhờ vậy một vòng lặp đi qua danh sách các đối tượng Hinh có thể gọi DienTich() trên từng cái mà không cần biết đó là HinhTron hay HinhChuNhat. Đây mới là lợi ích thật của hướng đối tượng: thêm một hình mới không phải sửa vòng lặp.

Đánh giá hướng đối tượng cho công bằng

Nó hợp với chương trình lớn do nhiều người cùng làm, vì đóng gói giới hạn phạm vi lan của một sai sót, và nó làm mã dùng lại được. Với một đoạn mã ngắn, nó thêm cấu trúc không cần thiết, và người mới học thường tạo ra những cây kế thừa phức tạp quá mức. Hãy nói rõ tình huống của đề thuộc loại nào.

Ví dụ — thiết kế lớp có đóng gói và kế thừa

Một hệ thống thư viện cần quản lý sách và đĩa DVD. Cả hai đều có mã, tiêu đề, năm phát hành và trạng thái đang mượn. Sách có thêm tác giả và số trang; DVD có thêm thời lượng và giới hạn độ tuổi.

Thiết kế các lớp bằng mã giả và giải thích ba nguyên lý được dùng.

Giải.

Lớp cha

CLASS TaiLieu
  PRIVATE Ma : STRING
  PRIVATE TieuDe : STRING
  PRIVATE NamPhatHanh : INTEGER
  PRIVATE DangMuon : BOOLEAN

  PUBLIC PROCEDURE NEW(m, t, n)
    Ma ← m : TieuDe ← t : NamPhatHanh ← n
    DangMuon ← FALSE
  ENDPROCEDURE

  PUBLIC FUNCTION GetTieuDe() RETURNS STRING
    RETURN TieuDe
  ENDFUNCTION

  PUBLIC PROCEDURE ChoMuon()
    IF DangMuon = TRUE THEN
      OUTPUT "Tài liệu đang được mượn"
    ELSE
      DangMuon ← TRUE
    ENDIF
  ENDPROCEDURE

  PUBLIC FUNCTION MoTa() RETURNS STRING
    RETURN TieuDe & " (" & NamPhatHanh & ")"
  ENDFUNCTION
ENDCLASS

Hai lớp con

CLASS Sach INHERITS TaiLieu
  PRIVATE TacGia : STRING
  PRIVATE SoTrang : INTEGER
  PUBLIC FUNCTION MoTa() RETURNS STRING  // ghi đè
    RETURN TieuDe & " — " & TacGia
  ENDFUNCTION
ENDCLASS

CLASS DVD INHERITS TaiLieu
  PRIVATE ThoiLuong : INTEGER
  PRIVATE GioiHanTuoi : INTEGER
  PUBLIC FUNCTION MoTa() RETURNS STRING  // ghi đè
    RETURN TieuDe & " [" & GioiHanTuoi & "+]"
  ENDFUNCTION
ENDCLASS

Ba nguyên lý được dùng ở đâu

Đóng gói: mọi thuộc tính là PRIVATE, chỉ đọc và sửa qua phương thức công khai. Nhờ đó ChoMuon() kiểm được trạng thái trước khi đổi — không đoạn mã nào bên ngoài đặt thẳng DangMuon ← TRUE được, nên không thể cho mượn hai lần một tài liệu.

Kế thừa: phần chung — mã, tiêu đề, năm, trạng thái mượn — viết một lần ở lớp TaiLieu. Nếu sau này thư viện thêm quy tắc mượn mới, chỉ sửa một chỗ và cả hai loại tài liệu đều nhận thay đổi.

Đa hình: cả hai lớp con ghi đè MoTa(). Nhờ vậy đoạn mã in danh mục có thể viết đơn giản là duyệt qua mảng TaiLieu và gọi MoTa() — phiên bản đúng tự được chọn theo kiểu thực tế. Thêm loại tài liệu thứ ba (ví dụ tạp chí) không phải sửa một dòng nào trong đoạn mã in danh mục.

Bẫy hay mất điểm — Khai báo thuộc tính là PUBLIC rồi vẫn viết thêm hàm lấy và hàm đặt. Như vậy là không có đóng gói: bất kỳ đoạn mã nào cũng bỏ qua hàm đặt và sửa thẳng thuộc tính, nên mọi kiểm tra hợp lệ trong hàm đặt trở nên vô nghĩa.
Phải nhớ — Lớp là khuôn, đối tượng là thể hiện. Đóng gói giữ thuộc tính riêng tư để kiểm soát mọi thay đổi; kế thừa mô hình quan hệ ‘là một’ và tránh lặp mã; đa hình cho phép thêm lớp con mới mà không sửa mã đang gọi.

Đọc xong rồi — làm thử ngay

Bài tập của chương Recursion, OOP and File Handling gồm 14 câu trắc nghiệm và 3 đề tự luận. Đáp án hiện ngay khi chọn, miễn phí.

Làm bài tập chương →