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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; namespace oop { class hinhchunhat { private int height; private int awidth; public hinhchunhat(int newHeight, int newWidth) { height = newHeight; awidth = newWidth; } public int tinhdientich() { return height * awidth; } } } |
- 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; namespace oop { class Program { static void Main(string[] args) { //thay doi properties (height, awidth) cua doi tuong thong qua method public hinhchunhat hcn = new hinhchunhat(10, 5); //lay du lieu thong qua method public Console.WriteLine("Dien tich cua {0} la: " + hcn.tinhdientich(),hcn); Console.ReadLine(); } } } |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System; namespace oop { class hinhdang { private void showColor() { Console.WriteLine("Mau hong"); } public void showType() { Console.WriteLine("Day la hinh chu nhat"); } } } using System; namespace oop { class Program : hinhdang { static void Main(string[] args) { Program pg = new Program(); pg.showType(); //pg.showColor(); khong the truy cap private method Console.ReadLine(); } } } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System; namespace oop { class hinhdang { public void showType() { Console.WriteLine("Day la hinh chu nhat"); } } } using System; namespace oop { class mausac : hinhdang { public void showColor() { Console.WriteLine("Mau hong"); } } } using System; namespace oop { class Program : mausac { static void Main(string[] args) { Program pg = new Program(); pg.showType(); pg.showColor(); Console.ReadLine(); } } } |
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:
- Method Overloading (compile time polymorphism)
- 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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System; namespace oop { class Program { static void Print(object o) { Console.WriteLine("Object overload called"); } static void Print(string a) { Console.WriteLine("String overload called"); } static void Main(string[] args) { object o = "hello"; Print(o); Console.ReadLine(); } } } |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
using System; namespace oop { class Animal { public void Speak() { Console.WriteLine("Animal is speaking..."); } } } using System; namespace oop { class Dog: Animal { public new void Speak(){ Console.WriteLine("Dog speaks go go"); } } } using System; namespace oop { class Cat:Animal { public new void Speak() { Console.WriteLine("Cat speaks meo meo"); } } } using System; namespace oop { class Program { static void Main(string[] args) { Animal dog = new Dog(); dog.Speaking(); Animal cat = new Cat(); cat.Speaking(); Console.ReadLine(); } } } |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
using System; namespace oop { class Animal { public virtual void Speak() { Console.WriteLine("Animal is speaking..."); } } } using System; namespace oop { class Dog: Animal { override public void Speak(){ Console.WriteLine("Dog speaks go go"); } } }
Có thể bạn quan tâm
0
|