Trích dẫn:
Nguyên bản được gửi bởi
one2one 
đúng như bạn nói, hum nọ mình đi pv họ hỏi mà, nếu đọc sách để hiểu đ/n về 4 cái tính chất của lập trình hướng đối tượng (đóng gói, kế thừa, đa hình, trừu tượng) thì mình có hiểu, nhưng để làm vào 1 bài lập trình thì mình k biết thì nào cần có nó và khi nào không, tại sao lại cần. Như mấy bài quản lý bằng winform mình làm, mình chẳng thấy cái tính chất nào trong đấy hết. Hum đi pv nhà pv hỏi: thế bài quản lý của em làm có phải là hướng đối tượng k?, lần đầu đi cũng trả lời là có, nhưng khi về mình mới ngẫm lại là chẳng thấy trong lúc mình làm nó có 4 cái tính chất của hướng đối tượng đâu. Họ hỏi mình thêm câu tính đa hình trong hướng đối tượng. Theo như mình đọc sách thì mỗi cái nói 1 kiểu
VD như mình có đọc 1 quyển sách họ cho ví dụ là: lớp giang viên, lớp sinh viên, lớp nhân viên đều có phương thức Show(), nhưng khi gọi phương thức Show() ở lớp giảng viên lại khác khi gọi phương thức Show() ở lớp sinh viên ===> đó là đa hình ( nhưng theo mình đó có lẽ là overload chứ k phải là override). Tiếp đó mình đọc 1 cuốn sách nó lại có 1 VD về tính đa hình: có lớp chiến binh, lớp này có thể tùy từng tình huống mà có cách xử lý khác nhau, VD như lớp này có thể đánh tay không để tấn công đối phương, có thể dùng bow hay thậm chí có thể dùng sword để tấn công đối phương ==>đó là tính đa hình. Đọc xong cái VD sau mình nghĩ có lẽ là đúng là đa hình. Hum đi pv họ hỏi là nếu đối tượng là cái bút thì em nói cho anh biết tính đa hình của cái bút, mình định nói là: cái bút nếu để viết thì là cái bút, nhưng nếu nó để đánh nhau thì nó có thể là hung khí giết người...nhưng mà bản chất mình vẫn chưa hiểu nên mình k dám trả lời
Vậy nên hum nay mới mạo muội hỏi các bạn của diễn đàn cộng đồng C việt, ai hiểu rõ bản chất về 4 tính chất của lập trình hướng đối tượng xin chỉ giáo cho mình (4 tính chất: đóng gói, kế thừa, đa hình, trừu tương )....Mình xin cảm ơn mọi người

Trong lập trình hướng đối tượng(OOP) có 4 tính chất là : Tính trừu tượng, giấu kín, kế thừa và đa hình
1. Tính trừu tượng : Việc bạn mô hình hóa thông tin của 1 sinh viên dưới dạng 1 lớp chính là bạn đã sử dụng nó rồi đó
Code:
public class Student
{
public string FirstName{get;set;}
public string LastName{get;set;}
public int Age{get;set;}
public static string Class
{
get;set;
}
public string overrider ToString()
{
return FirstName + " " + LastName;
}
}
2. Tính giấu kín : Chỉ bên trong lớp mới đc truy cập trực tiếp các thông tin private của chính lớp đó, bên ngoài lớp phải truy cập thông qua Property
Code:
public class Student
{
//Chỉ bên trong class Student mới được phép truy cập các trường này
private string _firstName;
private string _lastName;
//Bên ngoài lớp vẫn truy cập được nó nhưng thông qua thuộc tính
//Giấu cơ chế hoạt động bên trong(Bạn có thể hiểu là ông muốn lấy hoặc thay đổi tên của 1 Student thì ông phải truy cập qua FirstName tôi sẽ làm cho ông(Ông ko thể biết được tôi đã làm thế nào)
public string FirstName
{
get
{
return this._firstName;
}
set
{
this._firstName = value;
}
}
}
1 ví dụ trong thực tế là cái điện thoại bàn. Ông cứ nhập số điện thoại và nhấn nút gọi là tôi sẽ gọi đến số máy kia cho ông(Ông ko thể biết đc tôi làm như nào, tháo tung cái điện thoại ra chưa chắc ông đã biết )
3. Tính kế thừa(cái này quá rõ rồi)
4. Tính đa hình : Khi trong lớp cơ sở bạn sử dụng thuộc tính, phương thức... mà có sử dụng modifier virtual, sau đó trong lớp kế thừa từ lớp này overrider thuộc tính, phương thưc... đó
Giả sử bạn có 1 lớp Worker mô tả thông tin cơ bản 1 công nhân, với cách thức tính (lương bằng lương cơ bản * tổng số ngày làm việc)
Code:
public class Worker
{
public string FirstName{get;set;}
public string LastName{get;set;}
public decimal SalaryBasic
{
get;set;
}
public int TotalWork
{
get;
set;
}
public virtual decimal Salary()
{
return (SalaryBasic*TotalWork);
}
}
Bây h bạn muốn tính lương cho công nhân lao động chân tay(WorkerManual) nhưng cách thức tính lương (Lương cơ bản * tổng số ngày làm việc) + Phụ cấp :
Code:
public class WorkerManual:Worker
{
public string FirstName{get;set;}
public string LastName{get;set;}
public decimal Bonus{get;set;}
public decimal SalaryBasic
{
get;set;
}
public int TotalWork
{
get;
set;
}
public override decimal Salary()
{
return (SalaryBasic*TotalWork + Bonus);
}
}
Tương tự với quản lý(Manager) thì cách thức tính lương (Lương cơ bản * tổng số ngày làm việc + 5*Bonus) chẳng hạn :
Code:
public class Manager:Worker
{
public string FirstName{get;set;}
public string LastName{get;set;}
public decimal Bonus{get;set;}
public decimal SalaryBasic
{
get;set;
}
public int TotalWork
{
get;
set;
}
public override decimal Salary()
{
return (SalaryBasic*TotalWork + 5*Bonus);
}
}
Hy vọng giúp ích !