Lập trình hướng đối tượng C# (OOP)
Ôn lại lịch sử phương thức lập trình Lập trình được chia làm 3 giai đoạn: giai đoạn đầu tiên là lập trình tuyến tính, kế tiếp là lập trình cấu trúc, sau đó là lập trình hướng đối tượng.
- Lập trình tuyến tính: là phương pháp lập trình tư duy theo hướng tuần tự đơn giản, đơn luồng. Ưu điểm là đơn giản nhưng khó áp dụng cho các chương trình phức tạp.
- Lập trình hướng cấu trúc là lập trình hướng thủ tục, trong đó chương trình được chia thành các hàm. Chương trình được chia thành các hàm con, và được gọi trong hàm chính, , ví dụ: C, Pascal,.. Phần lớn dữ liệu được sử dụng chung chuyển từ hàm này sang hàm khác., tư duy giải thuật rõ ràng tuy nhiên không hỗ trợ sử dụng lại mã nguồn(cấu trúc dữ liệu thay đổi thì phải thay đổi code), chủ yếu là phát triển hàm ko quan tâm nhiều đến dữ liệu.
- Lập trình hướng đối tượng: là phương pháp lập trình hỗ trợ hướng đối tượng giúp chương trình có tính bảo mật cao, tái sử dụng code, tiết kiệm tài nguyên, mở rộng bảo trì,..
Khái niệm chính trong lập trình hướng đối tượng:
- Class: là đại diện cho tập hợp các đối tượng có cùng đặc điểm, hành vi, phương thức hoạt động. Thực chất là 1 kiểu dữ liệu do người dùng định nghĩa.
- Properties(thuộc tính): là những thông tin đặc điểm của đối tượng
- Method: contructor(có thể có nhiều), hàm thường, hàm destructor (1 class có 1 hàm này duy nhất), là các action của đối tượng
- Object: là 1 thực thể ngoài đời thực(ví dụ: con chó, con chim, xe máy, ..) có đặc tính, hành vi. Class là 1 tập hợp các đối tượng có cùng đặc tính hành vi(ví du: động vật, xe cộ)git Note:
- Từ khóa sealed(niêm phong): dùng cho method(không thể ghi đè) và class(không thể kế thừa)
- Từ khóa static: đánh dấu là thành phần tĩnh không thể được khởi tạo, sử dụng cho variable, method, class
- Từ khóa partial: chia class thành nhiều file
4 tính chất cơ bản trong lập trình hướng đối tượng
Tính đóng gói (Encapsulation): là tiến trình đóng gói một hoặc nhiều mục bên trong một gói logic hoặc vật lý nhằm đảm bảo toàn vẹn dữ liệu, kiểm soát việc truy cập chỉnh sửa dữ liệu từ các lớp bên ngoài, được thể hiện qua access modifier:
- private: phạm vi trong class
- protected: phạm vi trong class kế thừa
- public: không có giới hạn
- internal: phạm vi Assembly dự án
- protected internal: phạm vi Assembly hiện tại
Tính kế thừa (Inheritance): cho phép xây dựng 1 lớp con kết thừa các properties, method của lớp cha, có khả năng kết thừa và mở rộng Trong C#, không hỗ trợ đa kế thừa class(1 lớp kế thừa từ nhiều lớp) mà chỉ có thể đa kế thừa interface. Constructor và destructor không thể kế thừa, các thuộc tính và phương thức kế thừa dựa theo access modifier Về contructor, khi kế thừa lớp cha mà có thì lớp con cũng phải khởi tạo thông qua từ khóa base
Tính đa hình (polymorphism): Là một đối tượng thuộc các lớp khác nhau có thể hiểu cùng một thông điệp theo cách khác nhau.
- Các lớp phải có quan hệ kế thừa với cùng 1 lớp cha nào đó, Phương thức đa hình phải được ghi đè (override) ở các lớp con
- 1 Class có method cùng tên khác paramter Virtual là từ khoá dùng để khai báo 1 phương thức ảo (phương thức ảo là phương thức có thể ghi đè được). Override là từ khoá dùng để đánh dấu phương thức ghi đè lên phương thức của lớp cha.
Tính trừu tượng (Abstraction): là một tiến trình ẩn chi tiết triển khai, chỉ cung cấp thông tin tính năng tới người dùng, được thể hiện qua abstract và interface. Là 1 class, không thể tạo instance
abstract class
- 1 class abstract có thể chứa method thông thường(trường là có body), method virtual, method abstract(trống, khi kế thừa phải được override)
- Không thể sử dụng từ khóa sealed
- 1 class chỉ được kế thừa 1 abstract class, không hỗ trợ đa kế thừa
- access modifier phải là public hoặc protected
- chỉ khai báo abstract vào class, method, không khai báo vào properties
interface class
là 1 tập các thành phần chỉ khai báo, không có định nghĩa. Mục đích chính là giải quyết vấn đề đa kế thừa và cụ thể hóa hành vi của 1 loại dữ liệu cụ thể(đưa ra quy tắc code chung).
- Các thành phần trong interface gồm: properties, method, event, indexers
- Chỉ khai báo, ko được định nghĩa
- Ghi đè trong interface không cần từ khóa override
- access modifier bắt buộc là public
- Không chứa biến(properties)
- Không có contructor, destructor
- Hỗ trợ đa kế thừa
Sự khác nhau giữa Abstract class và Interface
interface | abstract |
---|---|
Có thế kế thừa từ các interface khác | Có thể kế thừa 1 class và nhiều interface khác |
Chỉ khai báo method không có body, không chứa biến | Có thể khai báo biến và method thường và method abstract |
Không có constructor và destructor | Có constructor và destructor |
access modifier phải là public | access modifie có thể khai báo tùy ý |
Dùng định nghĩa 1 khuân mẫu chung | Định nghĩa các thành phần chung của lớp(biến, method), sử dụng cho nhiều đối tượng cùng kiểu |
Class kế thừa bắt buộc phải implement tât cả các method trong interface | Có thể định nghĩa method phải implement(method abstract), hoặc không cần implement(method thường) |
Hỗ trợ đa kế thừa | Không hỗ trợ đa kế thừa |
Khi nào nên dùng abstract, interface?
- Khi 1 nhóm đối tượng có cùng bản chất kế thừa từ 1 class thì dùng abstract
- Khi 1 nhóm đối tượng không cùng bản chất nhưng hành động giống nhau thì dùng interface