Tổng quát hóa và đặc biệt hóa

Một phần của tài liệu Giáo trình lập trình hướng đối tượng (nghề lập trình viên máy tính cao đẳng) (Trang 64)

3. Kết nối cơ sở dữ liệu

1.1Tổng quát hóa và đặc biệt hóa

1.2. Tính kế thừa

Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng làTính kế thừa (Inheritance).Tính kế thừa cho phép chúng ta định nghĩa một lớp trong điều kiện

một lớp khác, mà làm cho nó dễ dàng hơn để tạo và duy trì một ứng dụng.Điều này cũng cung cấp một cơ hội để tái sử dụng tính năng code và thời gian thực thi nhanh hơn.

Khi tạo một lớp, thay vì viết toàn bộ các thành viên dữ liệu và các hàm thành viên mới, lập trình viên có thể nên kế thừa các thành viên của một lớp đang tồn tại.Lớp đang tồn tại này được gọi làBase Class - lớp cơ sở, và lớp mới được xem như làDerived Class – lớp thừa kế.

1.3. Lớp cơ sở, lớp dẫn xuất

Lớp cơ sở (Base Class) và Lớp thừa kế (Derived Class) trong C++

Một lớp có thể được kế thừa từ hơn một lớp khác, nghĩa là, nó có thể kế thừa dữ liệu và hàm từ nhiều lớp cơ sở.Để định nghĩa một lớp kế thừa (Derived Class), chúng ta sử dụng một danh sách để xác định các lớp cơ sở. Danh sách này liệt kê một hoặc nhiều lớp cơ sở và có form sau:

class lop_ke_thua: access_modifier lop_co_so

Ở đây,access_modifier làpublic, protected hoặcprivate, vàlop_co_so là tên của lớp

đã được định nghĩa trước đó. Nếu access_modifier không được sử dụng, thì mặc định là private.

Bạn xem xét ví dụ sau vớiHinh là lớp cơ sở vàHinhChuNhat là lớp kế thừa:

#include <iostream> using namespace std; // lop co so: Hinh class Hinh

{ public:

void setChieuRong(int rong) {

chieurong = rong; }

void setChieuCao(int cao) { chieucao = cao; } protected: int chieurong; int chieucao; };

// day la lop ke thua: HinhChuNhat class HinhChuNhat: public Hinh {

public:

int tinhDienTich() {

return chieurong * chieucao; } }; int main(void) { HinhChuNhat Hcn; Hcn.setChieuRong(14); Hcn.setChieuCao(30);

// in dien tich cua doi tuong.

cout<< "Tong dien tich la: " << Hcn.tinhDienTich() << endl; return 0;

1.4. Các dạng kế thừa 1.4.1. Đơn kế thừa

Thừa kế (Inheritance) là một trong 4 tính chất quan trọng của OOP, là thao tác cho phép một class Con có được các thuộc tính và thao tác của class Cha, như thể các thuộc tính và thao tác đó đã được định nghĩa tại class Con.

Ví dụ: class Con có thể sử dụng hàm PrintAge() của class Cha, nên kết quả console là 18.

1.4.2. Đa kế thừa

Đa kế thừa trong C++

Một lớp trong C++ có thể kế thừa các thành viên từ nhiều lớp, và đây là cú pháp: class lop_ke_thua: access_modifier lop_co_so_1, access_modifier lop_co_so_2... Tại đây, access_modifier làpublic, protected hoặcprivate và sẽ được cung cấp cho

mỗi lớp cơ sở, và chúng sẽ được phân biệt với nhau bởi dấu phảy như trên. Bạn thử ví dụ sau:

using namespace std; // lop co so: Hinh class Hinh

{ public: (adsbygoogle = window.adsbygoogle || []).push({});

void setChieuRong(int rong) {

chieurong = rong; }

void setChieuCao(int cao) { chieucao = cao; } protected: int chieurong; int chieucao; };

// lop co so: ChiPhiSonMau class ChiPhiSonMau {

public:

int tinhChiPhi(int dientich) {

return dientich * 300000; }

};

// day la lop ke thua: HinhChuNhat

class HinhChuNhat: public Hinh, public ChiPhiSonMau {

public:

int tinhDienTich() {

return chieurong * chieucao; } }; int main(void) { HinhChuNhat Hcn; int dientich; Hcn.setChieuRong(14);

Hcn.setChieuCao(30);

dientich = Hcn.tinhDienTich(); // in dien tich cua doi tuong.

cout<< "Tong dien tich la: " << Hcn.tinhDienTich() << " m2." <<endl; // in tong chi phi de son mau

cout<< "Tong chi phi de son mau la: " << Hcn.tinhChiPhi(dientich) << " VND." <<endl;

return 0; }

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

2. Các hình thức kế thừa

2.1. Hình thức kế thừa private

Kiểu kế thừa trong C++

Khi kế thừa từ một lớp cơ sở, lớp cơ sở đó có thể được kế thừa thông qua kiểu kế thừa làpublic, protected hoặcprivate. Kiểu kế thừa trong C++ được xác định bởi Access-

specifier

Chúng ta hiếm khi sử dụng kiểu kế thừa protected hoặcprivate, nhưng kiểu kế

thừapublic thì được sử dụng phổ biến hơn. Trong khi sử dụng các kiểu kế thừa khác sau.

Kiểu kế thừa private: Khi kế thừa từ một lớp cơ sở là private, thì các thành

viênpublic và protected của lớp cơ sở trở thành các thành viênprivate của lớp kế thừa

2.2. Hình thức kế thừa Protected

Kiểu kế thừa protected: Khi kế thừa từ một lớp cơ sở làprotected, thì các thành (adsbygoogle = window.adsbygoogle || []).push({});

viênpublic và protectedcủa lớp cơ sở trở thành các thành viên protected của lớp kế

thừa

2.3. Hình thức kế thừa Public

Kiểu kế thừa Public: Khi kế thừa từ một lớp cơ sở làpublic, thì các thành

viênpublic của lớp cơ sở trở thành các thành viênpublic của lớp kế thừa; và các thành

viênprotected của lớp có sở trở thành các thành viên protected của lớp kế thừa. Một

thành viên làprivate của lớp cơ sở là không bao giờ có thể được truy cập trực tiếp từ một lớp kế thừa, nhưng có thể truy cập thông qua các lời gọi tới các thành viênpublic và protected của lớp cơ sở đó.

3. Sự trùng tên trong kế thừa

Kế thừa có hay không thì bạn vẫn có thể code được thuộc tính & phương thức cho bất kì class nào. Tuy nhiên, khi câu chuyện project bắt đầu phức tạp, thì không có kế thừa sẽ khiến ta code dài và khó khăn hơn bao giờ hết. Ví dụ chúng ta đang code một hệ thống quản lý nhân viên, trong đó có class quản lý, nhân viên phòng A, phòng B và phòng C.

Mỗi class đều có một phương thức là getName(). Nếu không có kế thừa, ta phải viết đi viết lại phương thức này 4 lần , nếu chẳng may sai, ta tiếp tục sửa 4 lần nữa, thay vì 1. Có kế thừa, code sẽ được “clean” hơn.

Kế thừa cho phép xây dựng lớp mới từ lớp đã có (ví dụ xây dựng class Nhân viên, cho tất cả các đối tượng trong hệ thống quản lý kế thừa từ class Nhân viên).

Cho phép tổ chức các lớp chia sẻ mã chương trình chung, nhờ vậy có thể dễ dàng sửa chữa, nâng cấp hệ thống (Chỉ cần code phương thức getName() duy nhất 1 lần cho class Nhân viên, sau này có gì muốn sửa thì cũng chỉ sửa trong class Nhân viên).

Nâng cấp của kế thừa - đa kế thừa:

Nếu như kế thừa bình thường cho phép một lớp cha có nhiều lớp con thì đa kế thừa còn cho phép một lớp con được dẫn xuất từ nhiều lớp cha khác nhau. Lớp con này vẫn có thể sử dụng bất kì phương thức của lớp cha nào không chỉ từ một trong các lớp cha. Chúng ta phải sử dụng đa kế thừa trong một số trường hợp như ví dụ dưới, class B nhất thiết phải kế thừa đồng thời từ class A1 và A2, chứ không thể để A2 kế thừa A1, rồi B kế thừa A2 được, nếu như vậy class A2 sẽ mất đi ý nghĩa/ chức năng của nó.

4. Lớp cơ sở ảo và lớp cơ sở trừu tượng

Các lớp cơ sở ảo, được sử dụng trong kế thừa ảo, là một cách để ngăn chặn nhiều "trường hợp" của một lớp nhất định xuất hiện trong hệ thống phân cấp thừa kế khi sử dụng nhiều kế thừa.

Một lớp cơ sở trừu tượng là một lớp chỉ được dùng làm cơ sở cho các lớp khác. Không hề có đối tượng nào của một lớp trừu tượng được tạo ra cả, bởi vì nó chỉ được dùng để định nghĩa một số khái niệm tổng quát chung cho các lớp khác.

Ví dụ CON_VAT (con vật), nó sẽ dùng làm cơ sở để xây dựng các lớp con vật cụ thể như lớp

Bài tập thực hành Đề bài

Tạo classPeople gồm:

• Thuộc tính:name,age,address để lưu lần lượt các giá trị tên, tuổi và địa chỉ.

• Phương thức trong classPeople gồm:set(),get() là hàm nhập và xuất; hàm khởi tạo không tham số và hàm huỷ.

Tạo classStudents kế thừa từ classPeople. ClassStudents sẽ có thêm:

• Thuộc tínhid để lưu mã sinh viên,math lưu điểm môn toán,physical để lưu điểm môn vật lý,chemistry để lưu điểm môn hoá học.

• Phương thức:set(),get(),GPA() để tính điểm trung bình 3 môn học. class People

{

protected:

string name, address; int age; public: People() { name = address = ""; age = 0; } ~People() { name = address = ""; age = 0; } void set() {

cout<< "Input" << endl; fflush(stdin); cout<< "Name: "; fflush(stdin); getline(cin, this->name); cout<< "Address: "; fflush(stdin); getline(cin, this->address); cout<< "Age: ";

cin>> this->age; } (adsbygoogle = window.adsbygoogle || []).push({});

void get() {

cout<< "Output" << endl;

cout<< "Name: " << this->name << endl; cout<< "Address: " << this->address << endl; cout<< "Age: " << this->age << endl;

} }

BÀI 6: ĐA HÌNH VÀ GIAO DIỆN Mã bài: MĐLTV 16.05 Giới thiệu

Đa hình là một trong bốn tính chất đặc trưng của lập trình hướng đối tượng bên cạnh tính đóng gói, tính trừu tượng và tính kế thừa.Vậy thì đa hình là gì?

Đa hình (polymorphism) là hiện tượng mà các đối tượng thuộc các class khác nhau có thể biểu diễn cùng một thông thiệp theo các cách khác nhau. Hơi nặng về lý thuyết một chút nhưng xem ví dụ sau bạn sẽ rõ ngay!

Ví dụ hai con vật là con chó và con mèo, hai con vật này đều có thể phát ra tiếng nhưng con mèo sẽ kêu “meo meo” còn con chó lại sủa “gâu gâu”. Hành động phát ra tiếng này tuy là một hành động nhưng khi được 2 đối tượng khác nhau là chó và mèo thực hiện thì lại khác nhau.

Mục tiêu

- Trình bày khái niệm về nạp chồng, đa hình, giao diện.

- Trình bày được ý nghĩa, tác dụng của nạp chông, đa hình, giao diện- Xây dựng

được ví dụ mô tả tính chất đa hình, tính nạp chồng -Tạo được giao diện (interface) cho bài toán cụ thể - Sử dụng được các giao diện trong các ứng dụng thực tế.

Nội dung:

1. Nạp chồng hàm, nạp chồng toán tử

Ngôn ngữ C++ cho phép bạn xác định nhiều hơn một định nghĩa cho một tên hàm hoặc một toán tử trong cùng phạm vi (scope), được gọi tương ứng làNạp chồng hàm (function overloading) vàNạp chồng toán tử (operator overloading).Một khai báo

nạp chồng là một khai báo mà đã được khai báo với cùng tên như một khai báo được khai báo trước đó trong cùng phạm vi, ngoại trừ rằng: cả hai khai báo có các tham số khác nhau và định nghĩa khác nhau. Khi bạn gọi một hàm nạp chồng hoặc một toán tử nạp chồng, thì trình biên dịch quyết định định nghĩa thích hợp nhất để sử dụng bằng việc so sánh các kiểu tham số bạn đã sử dụng để gọi hàm hoặc toán tử với các kiểu tham số đã được xác định trong các định nghĩa. Tiến trình lựa chọn hàm nạp chồng hoặc toán tử nạp chồng thích hợp nhất này được gọi làphân giải nạp chồng ( overload

resolution ).

#include <bits/stdc++.h> Using namespace std; Int int_max (int a, int b) { if (a>b) Return a; Else Return b; } Int main()

Cout <<”int max=” <<int_max(4,5); Return 0;

}

Int max = 5

2. Đa hình2.1. Khái niệm 2.1. Khái niệm

Đa hình (polymorphism) là hiện tượng mà các đối tượng thuộc các class khác nhau có thể biểu diễn cùng một thông thiệp theo các cách khác nhau. Hơi nặng về lý thuyết một chút nhưng xem

ví dụ sau bạn sẽ rõ ngay!

Ví dụ hai con vật là con chó và con mèo, hai con vật này đều có thể phát ra tiếng nhưng con mèo sẽ kêu “meo meo” còn con chó lại sủa “gâu gâu”. Hành động phát ra tiếng này tuy là một hành động nhưng khi được 2 đối tượng khác nhau là chó và mèo thực hiện thì lại khác nhau.

2.2. Vai trò

Như định nghĩa của đa hình, đa hình thực hiện cùng một thông điệp theo các cách khác nhau, do đó, code của chúng ta sẽ không bị lặp.

Ví dụ mình có bài toán công ty quản lý hai loại nhân viên là nhân viên văn phòng (NVVP) và nhân viên sản xuất (NVSX), mình sẽ cho người dùng nhập nhân nhiên và tính lương sau đó xuất ra. Mình sẽ có sơ đồ class như sau:

2.3. Xây dựng ứng dụng sử dụng tính chất đa hình

Phương thức ảo (virtual method) trong C++ là cách thể hiện tính đa hình trong lập trình hướng đối tượng của C++, các phương thức ở class cơ sở có tính đa hình phải được định nghĩa là một phương thức ảo. (adsbygoogle = window.adsbygoogle || []).push({});

Và để khai báo một phương thức ảo, ta khai báo như bình thường nhưng thêm từ khóa “virtual” phía trước.

Class <className> ([params>]) { proteced:

Virtual <returnType><methodName> {}

};

Ví dụ như trong bài toán ở trên, các phương thức tính lương, nhập và xuất đều có tính đa hình do đối với hai đối tượng NVSX và NVVP thì sẽ có cách thực hiện phương thức khác nhau. Do đó, mình sẽ chỉnh sửa 3 phương thức này ở class dẫn xuất thành phương thức ảo như sau:

Class Nhanvien { public:

Virtual void nhap() {

// code goes here… Virtual void xuat() {

// code goes here… }

Virtual void tinhluong() {

// code goes here… }

};

3. Giao diện (Interface) 3.1. Khái niệm

Một interface giống như class, nhưng không có phần thực thi. Trong đó interface chỉ chứa các khai báo:

• Sự kiện (event)

• Indexer (một dạng thuộc tính đặc biệt trong C# cho phép lấy giá trị dựa trên chỉ mục)

• Phương thức (method) • Thuộc tính (property)

Một lý do tại sao interface chỉ chứa khai báo vì nó được kế thừa để thực thi bởi cả các lớp (class) và cấu trúc (struct)

Vậy, đâu là lợi thế khi interface không thực thi các chức năng?

Đó là vì trong các kiến trúc hệ thống làm việc với nhau theo dạng cắm – chạy (plug-n- play), các thành phần ở đó sẽ trao đổi thông tin cho nhau. Khi trao đổi thông tin, các thành phần sẽ thực thi chung interface, việc này có thể được sử dụng mà không cần phải viết thêm code. Theo đó, các interface sẽ bắt buộc các thành phần cung cấp đầy đủ các thành viên (member) ở dạng công khai (public) để được sử dụng theo cùng một cách thống nhất.

3.2. Cách khai báo và xây dựng giao diện trong C#

Trong khai báo interface thì thành phần bắt buộc phải có gồm: • Từ khóa interface

• Phần thân khai báo cho interface (interface-body)

Bài tập thực hành

1.Xây dựng các loại đối tượng sách giáo khoa, tiểu thuyết, tạp chí. Viết chương trình cho phép quản lý một danh sách các loại đối tượng kể trên.

Mỗi loại trên đều có thông tin chung như sau: Tên, Nhà xuất bản, Năm xuất bản, Số trang, Giá bán.

Đối với SGK có thêm thông tin về khối lớp; đối với tiểu thuyết có thêm thông tin về thể loại (giả tưởng, hình sự, kinh dị,…); đối với tạp chí có thêm thông tin về về dạng tạp chí theo định kỳ xuất bản (tuần san, nguyệt san, quý san,…)

2. Xây dựng lớp DaGiac thể hiện khái niệm đa giác với các thao tác cần thiết (nhập, xuất, tịnh tiến). Dùng kế thừa xây dựng các lớp tứ giác, tam giác.Viết chương trình cho phép nhập vào một tam giác hoặc tứ giác.Xuất và thực hiện các thao tác tịnh tiến hình đã nhập.

3. Thêm vào bài 2 các hình hình bình hành, hình chữ nhật và hình vuông. Định nghĩa lại các thao tác ở lớp con nếu cần. Xuất và thực hiện thao tác tịnh tiến hình đã nhập.

4. Viết chương trình cho phép nhập vào một trong các hình (tam giác, tứ giác, hình bình hành, hình chữ nhật, hình vuông) kể trên, xuất và thực hiện phép tịnh tiến cho các hình đã nhập. (adsbygoogle = window.adsbygoogle || []).push({});

5. Viết chương trình tính diện tích và chu vi các hình: Hình chữ nhật biết hai cạnh, hình tam giác biết ba cạnh, hình tròn biết bán kính. Chương trình có giao diện như sau: 1. Nhập kích thước các hình; 2. Hiện thị diện tích và chu vi các hình đã nhập; 3. Kết thúc chương trình.Lựa chọn công việc (1, 2, 3):Khi người sử dụng chọn 1 thì hỏi người sử dụng nhập kích thước cho hình nào, nhập xong hỏi người sử dụng có nhập tiếp không. Yêu cầu trong chương trình có cài đặt sự đa hình liên kết động.

BÀI 7: LẬP TRÌNH ANDROID CƠ BẢN Mã bài: MĐLTV 21.07

Giới thiệu

Hệ điều hành Android đang chiếm hơn 80% thị trường thiết bị di động hiện đại ngày

nay.Nhu cầu sử dụng ứng dụng di động cũng ngày càng cao. Nhu cầu việc làm về lập trình trên hệ điều hành mobile phổ biến nhất thế giới này cũng vì thế mà tăng mạnh do

Một phần của tài liệu Giáo trình lập trình hướng đối tượng (nghề lập trình viên máy tính cao đẳng) (Trang 64)