C# có 4 đặc điểm nổi bật chính là Abstraction (trừu tượng hóa), Encapsulation (đóng gói), Inheritance (kế thừa) và Polymorphism (đa hình).
Tuy nhiên, bản thân mình thấy cách phân chia này không hay. Nó không hay vì 1 lớp Abstract (trừu tượng) vốn được tạo ra chỉ để kế thừa. Vì thế nên gộp Abstraction và Inheritance làm một.
Trong C++ thì 3 đặc điểm này (đóng gói, kế thừa, đa hình) chính là 3 pillar (trụ cột chính) không thể đánh đổ.
Bây giờ mình sẽ giải thích về từng đặc điểm một.
Encapsulation (tính đóng gói): Tính đóng gói là một cách mô phỏng đời thật của lập trình hướng đối tượng. Trong cuộc sống thật, khi bạn có một cái gameboy, bạn biết cách khởi động nó, bạn biết cách nhấn nút để điều khiển trò chơi nhưng bạn không cần quan tâm xem bên trong cái máy gameboy ấy có những linh kiện gì và cũng không biết các linh kiện ấy hoạt động, tương tác với nhau như thế nào. Trong lập trình cũng vậy. Giả như bạn tạo ra một lớp trong C# tên là GameBoy. Bạn khai báo các biến đối tượng, nhưng bạn không để lộ thông tin đó ra bên ngoài. Người dùng lớp GameBoy mà bạn tạo, không biết được là bạn tạo cái lớp GameBoy đó thế nào (và thực sự là người ta cũng không cần biết). Cái người ta cần biết là khi tạo ra một lớp, bạn phải cung cấp một tài liệu về cách sử dụng cái lớp đó (cách tạo đối tượng từ lớp đó, cách gọi phương thức từ lớp đó ...v...v...). Sau đó người ta chỉ việc gọi phương thức từ lớp đó thôi chứ không cần biết lớp đó đã được tạo thế nào. Gọi phương phương thức mà không cần biết nó được tạo ra như thế nào cũng giống như việc chơi gameboy mà không cần biết bên trong hoạt động ra sao. --> tính đóng gói giúp bảo mật thông tin, tránh những can thiệp không cần thiết, giảm hỏng hóc, kiểm soát được trạng thái của đối tượng.
Inheritance (tính kế thừa): Một lớp con được thừa hưởng tất cả các thuộc tính và phương thức của lớp cha, như thế gọi là kế thừa. Tại sao phải kế thừa? Vì không có kế thừa thì không có đa hình (polymorphism). Kế thừa giúp tiết kiệm code, giúp chương trình dễ dàng bảo trì, nâng cấp, nhờ đó mà tiết kiệm được chi phí. Nếu chúng ta có các lớp khác nhau, và các lớp này có chung các trường dữ liệu cùng các phương thức nào đó, chúng ta sẽ abstract (trừu tượng hóa) các phương thức và trường dữ liệu đó ra một lớp riêng gọi là lớp cha. Các lớp còn lại, chúng ta cho kế thừa cái lớp mà chúng ta vừa mới tạo. Như vậy chúng ta không cần viết đi viết lại các đoạn code giống nhau nữa, mà chỉ cần viết những đoạn code khác nhau ở các lớp con thôi. Còn những đoạn code giống nhau thì lớp con nào cũng có, vì nó đã được kế thừa từ lớp cha. --> đây là một biểu hiện của việc dùng lại code.
Polymorphism (đa hình): Đa hình chính là mục tiêu lớn nhất của kế thừa (inheritance). Việc override hoặc overload một phương thức là biểu hiện của đa hình. Khi bạn viết một lớp có tên là Animal, bạn viết tiếp một lớp con của lớp Animal là lớp Cat, sau đó trong một lớp khác, bạn viết một phương thức mà tham số của phương thức đó là Animal: program.Kill(Animal a), đến khi sử dụng phương thức này, bạn không truyền vào một một đối tượng của lớp Animal, mà bạn truyền vào một đối tượng của lớp Cat: program.Kill(Cat c), đây là một ví dụ nữa của đa hình.
Không có nhận xét nào:
Đăng nhận xét