BÁO CÁO VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Người báo cáo Trần Bá Châu Mục lục 1) Lập trình hướng đối tượng là gì? 2 2) Các khái niệm cơ bản 2 2 1) Thuộc Tính (Attribute) 2 2 2) Phương Thức (Method) 3 2 3) L[.]
Trang 1BÁO CÁO VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Người báo cáo: Trần Bá Châu
Mục lục
1) Lập trình hướng đối tượng là gì? 2
2) Các khái niệm cơ bản 2
2.1) Thuộc Tính (Attribute): 2
2.2) Phương Thức (Method): 3
2.3) Lớp (Class): 3
2.2) Đối tượng (Object): 4
3) Các tính chất của lập trình hướng đối tượng: 5
3.1) Tính đóng gói (Encapsulation) 6
3.2) Tính kế thừa (Inheritance) 9
3.3) Tính đa hình (Polymorphism) 17
3.4) Tính trừu tượng (Abstraction) 20
Trang 21) Lập trình hướng đối tượng là gì?
Lập trình hướng đối tượng (Tiếng Anh: Object Oriented Programming, viết tắt: OOP) là một mô hình lập trình dựa trên khái niệm về Class và Object
Nó được sử dụng để tách một chương trình phần mềm thành các phần đơn giản, có thể tái sử dụng Lập trình hướng đối tượng được hiểu đơn giản là một phương pháp để giải quyết bài toán lập trình mà khi áp dụng code sẽ trở nên dễ phát triển và dễ bảo trì hơn Đây
là một phương pháp tiên tiến, phù hợp để phát triển hầu hết các ứng dụng hiện nay Phương pháp này sẽ giải quyết bài toán bằng cách chia chương trình thành các đối tượng (Object), với mỗi đối tượng sẽ có các thuộc tính (Attribute) và phương thức (Method)
Có nhiều ngôn ngữ lập trình hướng đối tượng như C ++, Java, Python,
2) Các khái niệm cơ bản
2.1) Thuộc Tính (Attribute):
Là những đặc điểm, thông tin của đối tượng (Vd: Xét với đối tượng là một người thì sẽ có các thuộc tính là: Tên, Tuổi, Màu Da, Màu Tóc, Chiều Cao, Cân Nặng, …)
Trang 32.2) Phương Thức (Method):
Là những hành động mà đối tượng đó có thể thưc hiện (VD: Vẫn xét với đối tượng
là một người thì sẽ có hành động: đi, nói, ăn, uống, …)
2.3) Lớp (Class):
Là nơi định nghĩa thông tin về các đối tượng, có thể hiểu Lớp là một kiểu dữ liệu
mà biến của kiểu dữ liệu này được coi là một đối tượng Trong Lớp có các thuộc tính (attribute) và phương thức (method)
Ví dụ:
Trang 42.2) Đối tượng (Object):
Là một thể hiện của Lớp, bạn có thể hiểu đối tượng là một biến
Ví dụ từ class Người bên trên, ta có thể tạo ra một Will Smith, 20 tuổi, nhà giàu:
Trang 53) Các tính chất của lập trình hướng đối tượng:
Trong lập trình hướng đối tượng có 4 tính chất là tính đóng gói (Encapsulation), tính
kế thừa (Inheritance), tính đa hình (Polymorphism) và tính trừu tượng (Abstraction)
Trang 7Với cách làm này thông tin của đối tượng đã được ẩn đi, ta chỉ có thể giao tiếp với đối tượng thông qua các phương thức Các lợi ích chính mà tính đóng gói đem lại:
• Hạn chế được các truy xuất không hợp lệ tới các thuộc tính của đối tượng
Trang 8• Giúp cho trạng thái của các đối tượng luôn đúng Ví dụ nếu thuộc tính gpa của lớp Student là public thì sẽ rất khó kiểm soát được giá trị, ta có thể thay gpa thành bất
kì giá trị nào Ngược lại, nếu ta để thuộc tính gpa là private và cung cấp hàm setGpa() như sau
Thì lúc này giá trị của thuộc tính gpa sẽ luôn được đảm bảo là không âm và nhỏ hơn hoặc bằng 4 (do muốn thay đổi gpa thì phải thông qua hàm setGpa())
• Giúp ẩn đi những thông tin không cần thiết về đối tượng
Che giấu dữ liệu chỉ là một phương pháp kỹ thuật mà ta áp dụng để xây dựng nên class
mà thôi, nó không phải là tính chất đặc trưng của lập trình hướng đối tượng, việc ta có áp dụng phương pháp này hay không là hoàn toàn không bắt buộc Tuy nhiên trong các hệ thống thật, để nâng cao tính bảo mật, giảm phụ thuộc giữa các class, tránh lỗi đọc ghi dữ liệu sai cách, … thì việc áp dụng phương pháp che giấu dữ liệu gần như là đương nhiên
Trang 93.2) Tính kế thừa (Inheritance)
Giả sử ta cần viết một chương trình lưu thông tin về các học sinh và giáo viên Với học sinh thì ta cần lưu các thông tin về tên, tuổi, địa chỉ, gpa còn với giáo viên thì ta cần lưu thông tin về tên, tuổi, địa chỉ và tiền lương Ta nhận thấy được vấn đề đó là lớp Student
và lớp Teacher có chung quá nhiều thuộc tính và phương thức Vậy nếu cứ làm như bình thường thì code này sẽ bị trùng lặp rất nhiều và vi phạm nguyên tắc DRY( Don’t Repeat Yourself – đừng lặp lại code) Kế thừa trong OOP sẽ giúp bạn giải quyết vấn đề này
Kế thừa trong lập trình hướng đối tượng chính là thừa hưởng lại những thuộc tính
và phương thức của một lớp Có nghĩa là nếu lớp A kế thừa lớp B thì lớp A sẽ có những thuộc tính và phương thức của lớp B Do đó, ta sẽ tách các thuộc tính và phương thức trùng nhau ra một lớp mới tên là Person và cho lớp Student và Teacher kế thừa lớp này Lớp được thừa hưởng gọi là lớp con( Subclass) và lớp bị kế thừa gọi là lớp cha ( Parent Class)
Trong ngôn ngữ lập trình C++, ta có thể thực hiện kế thừa bằng cú pháp “ :public “ giống như chương trình sau
Trang 11Kết quả khi chạy chương trình :
Trang 12Có thể thấy rằng lớp Student đã được thừa hưởng những phương thức của lớp Person
Trong kế thừa, khi lớp con khai báo phương thức có tên trùng với phương thức ở lớp cha thì phương thức của lớp cha sẽ bị thay thế bởi phương thức lớp con Ví dụ:
Kết quả khi chạy chương trình:
Trang 13Có thể thấy phương thức display() của lớp Superclass (lớp cha) đã bị thay thế bởi phương thức display() của lớp Subclass (lớp con)
Khi đó ta cần dùng toán tử “ :: “ Ví dụ:
Kết quả khi chạy chương trình :
Trang 14Lưu ý 1: Khi lớp cha có 2 lớp con trở lên thì phải thêm “ #pragma once “vào đầu file lớp cha để file lớp cha chỉ được gọi 1 lần nếu không sẽ dẫn đến lỗi
Ví dụ:
Trang 15Khi chạy file source.cpp sẽ có lỗi như sau:
Trang 16Có thể thấy đoạn code trong 3 file trên không sai nhưng chương trình lại hiển thị ra lỗi, lý
do là vì file Person.cpp đã được include nhiều lần dẫn tới trình biên dịch thấy có nhiều hơn một lớp Person, ta có thể hiểu đơn giản câu lệnh #include sẽ copy và paste file được include vào file hiện tại, do đó source code trong file source.cpp đã include file Person.cpp nhiều lần dẫn đến chương trình báo lỗi như trên Để tránh được lỗi này ta phải thêm câu lệnh tiền
xử lý #pragma once vào trong file Person.cpp để tránh việc include nhiều lần:
Trang 173.3) Tính đa hình (Polymorphism)
Trong lập trình hướng đối tượng và cụ thể là trong ngôn ngữ C++ thì tính đa hình
có 2 dạng:
• Dạng 1 – Compile time Polymorphism: Một class có nhiều hàm cùng tên nhưng
khác nhau về số lượng tham số hoặc kiểu dữ liệu của tham số Khi gọi hàm cùng tên đó thì trong quá trình biên dịch, compiler sẽ quyết định hàm nào (trong số các hàm cùng tên) sẽ được gọi dựa trên số lượng tham số và kiểu dữ liệu của tham số
truyển vào hàm Việc định nghĩa các hàm cùng tên được gọi là overloading – nạp
chồng phương thức
Trang 18• Dạng 2 – Runtime Polymorphism: Cùng một class có thể cho ra nhiều biến thể,
không phải được định nghĩa bởi lớp đó, mà bởi các lớp con của nó Đây là một phương pháp để định nghĩa lại hành vi của lớp cơ sở mà không phải sửa code (còn gọi là Implementation) của lớp cơ sở Nếu gọi hàm của đối tượng của lớp dẫn xuất
Trang 19thông qua con trỏ của lớp cơ sở thì việc hàm nào (của lớp cơ sở hay) Runtime
Polymorphism được thực hiện bằng phương pháp overriding – ghi đè phương
thức
Trang 203.4) Tính trừu tượng (Abstraction)
Tính trừu tượng là một trong 4 tính chất đặc trưng trong lập trình hướng đối tượng, mục tiêu chính của tính trừu tượng là ẩn đi những thông tin không cần thiết để chỉ tập trung vào những tính năng của đối tượng Tính chất này giúp bạn trọng tâm hơn vào những tính năng thay vì phải quan tâm tới cách mà nó được thực hiện Ví dụ về tính trừu tượng trong đời sống:
Khi bạn đi rút tiền ở cây ATM thì bạn không cần quan tâm tới cách mà cây ATM hoạt động hay các thành phần có trong cây ATM, cái mà bạn quan tâm duy nhất đó là tính năng rút tiền Trong trường hợp này các thông tin không cần thiết của cây ATM đã được
ẩn đi, đó chính là tính trừu tượng
Tương tự trong lập trình cũng vậy, khi sử dụng một đối tượng bạn chỉ cần quan tâm tới các phương thức của đối tượng đó được dùng để làm gì chứ không cần quan tâm tới phương thức đó được code như thế nào Để thực hiện tính trừu tượng trong C++ thì bạn có thể sử dụng lớp trừ tượng (abstract class)
Lớp trừu tượng là lớp mà có các đặc điểm sau:
• Lớp trừu tượng là lớp có ít nhất một phương thức trừu tượng Phương thức trừu tượng là các phương thức virtual được gán giá trị = 0 Có thể thấy phương thức trừu tượng là phương thức chỉ có phần khai báo, không có phần cài đặt => khi nhìn vào phương thức này thì thứ duy nhất mà bạn nhìn thấy là tính năng của nó (thay vì thấy
cả cách nó được cài đặt)
Trang 21• Bạn không thể khởi tạo được đối tượng của lớp trừu tượng mà chỉ có thể khởi tạo được đối tượng của lớp con
• Nếu một lớp được kế thừa từ lớp trừu tượng thì lớp đó phải ghi đè tất cả các phương thức trừu tượng
Ví dụ:
Trang 22Tóm lại, khi nhìn vào các lớp trừu tượng thì thứ duy nhất mà bạn thấy đó là các tính năng của lớp đó (các phương thức trừu tượng) Trong trường hợp một lớp chỉ bao gồm các phương thức trừu tượng thì lớp đó được coi là trừu tượng hoàn toàn