19/10/2019, 10:40

4 đặc tính của lập trình hướng đối tượng (OOP-Object oriented program)

Lập trình hướng đối tượng quá quen thuộc rồi bạn nào học lập trình đều phải học, đi phỏng vấn cũng vậy hỏi suốt(chắc cái này tùy vào vị trí tuyển dụng chủ yếu junior chắc chắn sẽ hỏi). Nó là nền tảng cho hầu hết các design pattern hiện nay.Bài viết này đúc rút kinh nghiệm thực tế và ...

Lập trình hướng đối tượng quá quen thuộc rồi bạn nào học lập trình đều phải học, đi phỏng vấn cũng vậy hỏi suốt(chắc cái này tùy vào vị trí tuyển dụng chủ yếu junior chắc chắn sẽ hỏi). Nó là nền tảng cho hầu hết các design pattern hiện nay.Bài viết này đúc rút kinh nghiệm thực tế và độ hiểu của mình về OOP. Lập trình hướng đối tượng là một kỹ thuật lập trình cho phép lập trình viên tạo ra các đối tượng trong code để trừu tượng hóa các đối tượng thực tế trong cuộc sống.

Tính đóng gói (Encapsulation):

Là cách để che dấu những tính chất xử lý bên trong của đối tượng, những đối tượng khác không thể tác động trực tiếp làm thay đổi trạng thái  chỉ có thể tác động thông qua các method public của đối tượng đó. Mình sẽ tạo ra 2 class để thể hiện điều này:

xem cách thể hiện bằng code dưới đây : class hinhchunhat

  • height và awidth ở đây chính là các tính chất (properties) của đối  tượng class hinhchunhat
  • tinhdientich() là method được public nhằm mục đích tương tác với các đối tượng khác. Tạo một class Program với method static để run, xem cách tương tác và thay đổi tính chất  của đối tượng thông qua các method public như nào:

Output:

Như vậy khi ta muốn thay đổi các tính chất (properties) không thể tương tác trực tiếp với properties mà phải thông qua các method public được định nghĩa bên trong class

  • không thể biết luồng xử lý logic bên trong của đối tượng

Tính kế thừa (Inheritance):

Là kỹ thuật cho phép kế thừa lại những tính năng mà một đối tượng khác đã có, giúp tránh việc code lặp dư thừa mà chỉ xử lý công việc tương tự.

  • Kế thừa một cấp (Single level Inheritance): Với một class cha và một class con

Output:

Trong class Program không hề có method showType() nhưng vẫn có thể truy cập sử dụng nó bằng cách kế thừa lại method của class hinhdang Kế thừa nhiều cấp (Multiple level Inheritance): Kế thừa  nhiều class.

Ở diagram trên mình viết thêm class mausac và chuyển private  method showColor() sang class mausac  thành public method.

Output:

class Program chỉ kế thừa class mausac nhưng vẫn có thể truy cập method showType() được viết trong class hinhdang, đây chính là hình thức kế thừa nhiều cấp,rất tiện đúng không?

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.

Ví dụ đa hình trong thực tế: Mình có 2 con vật: chó, mèo hai con vật này khi nhận được mệnh lệnh  là “hãy kêu” thì chó kêu “gâu gâu”,  mèo kêu “meo meo”.

Ví dụ trên cả 2 con vật đều hiểu chung một thông điệp “hãy kêu” và thực hiện theo cách riêng của chúng.

Trong code để thể hiện tính đa hình có 2 cách:

  1. Method Overloading (compile time polymorphism)
  2. Method Overriding (run time polymorphism)
  • Method Overloading : là cách nạp chồng các method có cùng tên nhưng khác tham số

Tạo 1 class Program gồm 2 method Print() có tham số khác nhau (hai method này được gọi là medthod overloading)

Output:

Ở đây Print(object) được gọi vì o là loại object, để xác định method nào được gọi ra chúng xác định bằng loại param hoặc số lượng param chuyền vào.

  • Method Overriding:  Đây là một phương pháp được ghi đè lại các method ảo của một lớp cha nào đó(được khai báo bằng từ khóa virtual).

Để thể hiện phương pháp này cần dùng 2 từ khóa:

  • virtual :từ khoá dùng để khai báo 1 phương thức ảo (có thể ghi đè được).
  • override: từ khoá dùng để đánh dấu phương thức ghi đè lên phương thức của lớp cha.

Tạo ra 3 class Animal,Dog,Cat

Output:

Như bạn có thể thấy ở trên mình không dùng đến 2 từ khóa là virtual và override, mặc dù mình khởi tạo lớp Dog và sử dụng method Speak() kết quả in ra dữ liệu của method trong lớp Animal như vậy không thể hiện được tính đa hình.

Sau đây mình sẽ sử dụng 2 từ khóa virtual và override: