1. Nguyên tắc `Single Responsibility Principle` (SRP) trong SOLID phát biểu rằng:
A. Một lớp nên có nhiều lý do để thay đổi.
B. Một lớp chỉ nên có một lý do duy nhất để thay đổi.
C. Các lớp con có thể thay thế lớp cha mà không làm thay đổi tính đúng đắn của chương trình.
D. Phụ thuộc vào sự trừu tượng, không phụ thuộc vào sự cụ thể.
2. Kiểu phạm vi truy cập `private` có ý nghĩa gì?
A. Thành viên có phạm vi `private` có thể được truy cập từ bất kỳ đâu.
B. Thành viên có phạm vi `private` chỉ có thể được truy cập từ bên trong chính lớp đó.
C. Thành viên có phạm vi `private` có thể được truy cập từ lớp con.
D. Thành viên có phạm vi `private` có thể được truy cập từ các lớp khác trong cùng package (nếu ngôn ngữ hỗ trợ package).
3. Trong OOP, `tính trừu tượng` (abstraction) nhằm mục đích gì?
A. Làm cho chương trình chạy chậm hơn.
B. Ẩn đi sự phức tạp không cần thiết và chỉ hiển thị những thông tin quan trọng.
C. Tăng sự phụ thuộc giữa các đối tượng.
D. Sao chép mã nguồn.
4. Thuộc tính (attribute) của một đối tượng trong OOP còn được gọi là gì?
A. Phương thức (method)
B. Biến thành viên (member variable) hoặc trường (field)
C. Lớp (class)
D. Đối tượng (object)
5. Nguyên tắc `SOLID` trong OOP là tập hợp các nguyên tắc thiết kế hướng đến mục tiêu chính nào?
A. Tăng độ phức tạp của mã.
B. Giảm khả năng bảo trì và mở rộng.
C. Thiết kế phần mềm dễ bảo trì, dễ mở rộng và dễ hiểu.
D. Tăng thời gian phát triển phần mềm.
6. Nguyên tắc `Interface Segregation Principle` (ISP) trong SOLID khuyến khích điều gì?
A. Tạo ra các giao diện lớn và đa năng.
B. Tạo ra nhiều giao diện nhỏ, chuyên biệt hơn là một giao diện lớn, đa năng.
C. Không sử dụng giao diện.
D. Gộp tất cả các phương thức vào một giao diện duy nhất.
7. Phương thức khởi tạo (constructor) trong lập trình hướng đối tượng có vai trò chính là gì?
A. Hủy bỏ đối tượng khi không còn sử dụng.
B. Thay đổi trạng thái của đối tượng sau khi tạo.
C. Khởi tạo trạng thái ban đầu của đối tượng khi đối tượng được tạo ra.
D. Gọi các phương thức khác của đối tượng.
8. Phương thức `static` (tĩnh) trong OOP có đặc điểm gì?
A. Luôn cần một đối tượng để gọi phương thức static.
B. Có thể được gọi trực tiếp thông qua tên lớp mà không cần tạo đối tượng.
C. Không thể truy cập thuộc tính của lớp.
D. Chỉ được sử dụng trong lớp con.
9. Nguyên tắc `Dependency Inversion Principle` (DIP) trong SOLID đề xuất cách tiếp cận nào để giảm sự phụ thuộc giữa các module?
A. Phụ thuộc trực tiếp vào các lớp cụ thể.
B. Phụ thuộc vào các lớp trừu tượng (interfaces hoặc abstract classes) thay vì các lớp cụ thể.
C. Không sử dụng lớp trừu tượng.
D. Tăng cường sự phụ thuộc giữa các module.
10. Trong lập trình hướng đối tượng, `class` được hiểu là gì?
A. Một thể hiện cụ thể của đối tượng.
B. Một bản thiết kế hoặc khuôn mẫu để tạo ra các đối tượng.
C. Một phương thức đặc biệt để khởi tạo đối tượng.
D. Một kiểu dữ liệu nguyên thủy.
11. Tính chất `kế thừa` (inheritance) trong OOP mang lại lợi ích nào sau đây?
A. Tăng tính phức tạp của mã nguồn.
B. Giảm khả năng tái sử dụng mã.
C. Cho phép lớp con (subclass) kế thừa thuộc tính và phương thức từ lớp cha (superclass), tăng khả năng tái sử dụng mã.
D. Hạn chế khả năng mở rộng của chương trình.
12. Mối quan hệ `IS-A` trong OOP thường được thể hiện thông qua cơ chế nào?
A. Đóng gói (Encapsulation)
B. Kế thừa (Inheritance)
C. Đa hình (Polymorphism)
D. Trừu tượng (Abstraction)
13. Đa hình (polymorphism) trong OOP có nghĩa là gì?
A. Một đối tượng có nhiều thuộc tính.
B. Một lớp có nhiều phương thức khởi tạo.
C. Các đối tượng thuộc các lớp khác nhau có thể được xử lý thông qua một giao diện chung, hoặc một phương thức có thể hoạt động khác nhau tùy thuộc vào đối tượng gọi nó.
D. Một phương thức có thể được gọi từ nhiều đối tượng khác nhau.
14. Nguyên tắc `Open/Closed Principle` (OCP) trong SOLID phát biểu rằng:
A. Phần mềm nên đóng để mở rộng và mở để sửa đổi.
B. Phần mềm nên mở để mở rộng và đóng để sửa đổi.
C. Phần mềm nên mở cho cả mở rộng và sửa đổi.
D. Phần mềm nên đóng cho cả mở rộng và sửa đổi.
15. Khái niệm `đa hình thời gian biên dịch` (compile-time polymorphism) thường được thể hiện thông qua cơ chế nào trong OOP?
A. Ghi đè phương thức (method overriding).
B. Nạp chồng phương thức (method overloading).
C. Kế thừa (inheritance).
D. Đóng gói (encapsulation).
16. Kiểu phạm vi truy cập `protected` thường được sử dụng trong ngữ cảnh nào?
A. Để làm cho thành viên có thể truy cập công khai từ mọi nơi.
B. Để giới hạn truy cập chỉ từ bên trong lớp.
C. Để cho phép truy cập từ bên trong lớp và các lớp con kế thừa.
D. Để giới hạn truy cập chỉ từ các lớp trong cùng package.
17. Trong lập trình hướng đối tượng, `đối tượng` (object) là gì?
A. Một bản thiết kế lớp.
B. Một kiểu dữ liệu.
C. Một thể hiện cụ thể của một lớp, có trạng thái và hành vi.
D. Một phương thức đặc biệt.
18. Tính `đa kế thừa` (multiple inheritance) trong OOP là gì?
A. Một lớp chỉ có thể kế thừa từ một lớp cha.
B. Một lớp có thể kế thừa từ nhiều lớp cha.
C. Một lớp cha có thể có nhiều lớp con.
D. Không có khái niệm đa kế thừa trong OOP.
19. Trong mô hình hướng đối tượng, thông điệp (message) thường được dùng để chỉ điều gì?
A. Dữ liệu được truyền giữa các đối tượng.
B. Lời bình luận trong mã nguồn.
C. Yêu cầu một đối tượng thực hiện một hành động (gọi một phương thức).
D. Thông báo lỗi chương trình.
20. Trong ngữ cảnh của kế thừa, lớp `cha` còn được gọi bằng thuật ngữ nào khác?
A. Lớp con (subclass)
B. Lớp dẫn xuất (derived class)
C. Lớp cơ sở (base class) hoặc lớp siêu (superclass)
D. Lớp giao diện (interface class)
21. Nhược điểm tiềm ẩn của việc sử dụng lập trình hướng đối tượng là gì?
A. Khó tái sử dụng mã.
B. Khó bảo trì và mở rộng.
C. Có thể làm tăng độ phức tạp và thời gian phát triển ban đầu, đặc biệt nếu thiết kế không tốt.
D. Chương trình thường chạy nhanh hơn so với lập trình hướng thủ tục.
22. Lớp trừu tượng (abstract class) khác với lớp thông thường ở điểm nào?
A. Lớp trừu tượng không thể chứa thuộc tính.
B. Lớp trừu tượng không thể có phương thức.
C. Lớp trừu tượng không thể được khởi tạo trực tiếp (không thể tạo đối tượng từ lớp trừu tượng), và có thể chứa các phương thức trừu tượng (abstract methods).
D. Lớp trừu tượng có thể được khởi tạo như lớp thông thường.
23. Phương thức (method) của một đối tượng trong OOP thể hiện điều gì?
A. Dữ liệu của đối tượng.
B. Hành vi hoặc thao tác mà đối tượng có thể thực hiện.
C. Kiểu dữ liệu của đối tượng.
D. Tên của đối tượng.
24. Trong OOP, `phạm vi truy cập` (access modifiers) dùng để làm gì?
A. Thay đổi kiểu dữ liệu của thuộc tính.
B. Kiểm soát mức độ truy cập từ bên ngoài vào các thành viên (thuộc tính, phương thức) của lớp.
C. Tạo ra các đối tượng.
D. Định nghĩa lớp.
25. Giao diện (interface) trong OOP có vai trò chính là gì?
A. Cung cấp cài đặt chi tiết của các phương thức.
B. Định nghĩa một hợp đồng, quy định các phương thức mà một lớp phải thực hiện, mà không cung cấp cài đặt cụ thể.
C. Tạo ra các đối tượng.
D. Ẩn dữ liệu của đối tượng.
26. Phương thức `ảo` (virtual method) trong OOP liên quan mật thiết đến khái niệm nào?
A. Đóng gói (Encapsulation)
B. Kế thừa (Inheritance) và Đa hình (Polymorphism)
C. Trừu tượng (Abstraction)
D. Tổng hợp (Composition)
27. Nguyên tắc `Liskov Substitution Principle` (LSP) trong SOLID liên quan đến vấn đề gì trong kế thừa?
A. Tính đóng gói.
B. Tính trừu tượng.
C. Tính đa hình và khả năng thay thế lớp cha bằng lớp con.
D. Tính tái sử dụng mã.
28. Khái niệm nào sau đây là trụ cột chính của lập trình hướng đối tượng, cho phép che giấu thông tin và chỉ hiển thị những gì cần thiết ra bên ngoài?
A. Kế thừa (Inheritance)
B. Đa hình (Polymorphism)
C. Đóng gói (Encapsulation)
D. Trừu tượng (Abstraction)
29. Ưu điểm chính của việc sử dụng lập trình hướng đối tượng so với lập trình hướng thủ tục là gì?
A. Tốc độ thực thi chương trình nhanh hơn.
B. Mã nguồn ngắn gọn hơn.
C. Tính tái sử dụng mã, khả năng bảo trì và mở rộng tốt hơn, quản lý độ phức tạp của dự án lớn hiệu quả hơn.
D. Dễ học và dễ sử dụng hơn cho người mới bắt đầu.
30. Mối quan hệ `HAS-A` trong OOP thường được thể hiện thông qua cơ chế nào?
A. Kế thừa (Inheritance)
B. Tổng hợp (Composition) hoặc Liên kết (Aggregation)
C. Đa hình (Polymorphism)
D. Trừu tượng (Abstraction)