Từkháiquátđếncụthể Tính thừa kế cũng thường dùng để thiết kế các bài toán theo hướng từkháiquátđếncụ thể, từ chung đến riêng. Đầu tiên đưa ra các lớp để mô tả những đối tượng chung, sau đó dẫn xuất tới các đối tượng ngày một cụthể hơn. Một trường hợp khác cũng thường gặp là: Quản lý nhiều thực thể có những phần dữ liệu chung. Khi đó ta có thể xây dựng một lớp cơ sở gồm các phần dữ liệu chung. Mỗi thực thể sẽ được mô tả bằng một lớp dẫn xuất từ lớp cơ sở này. Sau đây là một số ví dụ minh hoạ: Ví dụ 1 (minh hoạ tư tưởng đi từkháiquátđếncụ thể) : Giả sử cần quản lý sinh viên của một trường đại học. Khi đó ta có thể bắt đầu từ lớp SINH_VIEN (Sinh viên). Sau đó dùng nó làm cơ sở để dẫn xuất tới các lớp mô tả các đối tượng sinh viên cụthể hơn, ví dụ: SV Tin, SV Toán, SV Luật, SV Du lịch, . Các bài toán kiểu như vậy rất thường gặp trong thực tế. Ví dụ 2 (minh hoạ phần chung của nhiều thực thể). Giả sử cần xây dựng phần mềm để thực hiện các phép tính về ma trân vuông và véc tơ cấp n. Ta có nhận xét là n chung cho cả véc tơ và ma trận. Hơn nữa nó còn chung cho tất cả các ma trận và véc tơ cùng xét trong bài toán. Vì vậy có thể định nghĩa một lớp cơ sở chỉ có một thuộc tính tĩnh (static) n. Các lớp ma trận, véc tơ dẫn xuất từ lớp này và sử dụng chung cùng một giá trị n. Dưới đây là chương trình thực hiện các phép toán ma trận, véc tơ. Chương trình được tổ chức thành 3 lớp: Lớp CAP (Cấp ma trận, véc tơ) gồm một thành phần tĩnh n và phương thức nhập n. Lớp VT (Véc tơ) có một thuộc tính là mảng một chiều (chứa các phần tử của véc tơ) và các phương thức nhập, xuất. Lớp MT (Ma trận) có một thuộc tính là mảng 2 chiều (chứa các phần tử của ma trận) , các phương thức nhập, xuất và nhân. Lớp MT là bạn của lớp VT. Chương trình sẽ nhập một ma trận, nhập một véc tơ và tính tích của chúng. //CT5-13 // ma tran vec to // Dùng thuộc tính static #include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h> class CAP; class MT; class VT; class CAP { private: static int n; public: void nhap() { int ch; if (n==0) { cout << "\nN= "; cin >> n; } else { cout <<"\n Hien n = " << n; cout << "\n Co thay doi n? - C/K"; ch=toupper(getch()); if (ch=='C') { cout << "\nN= "; cin >> n; } } } int getN() { return n; } } ; int CAP::n=0; class MT : public CAP { private: double a[20][20]; public: void nhap(); void xuat(); VT operator*(VT x); }; class VT : public CAP { private: double x[20]; public: friend class MT; void nhap(); 311 312 void xuat(); }; void MT::nhap() { int n,i,j; n = this->getN(); if (n==0) { this->CAP::nhap(); n = this->getN(); } for (i=1; i<=n; ++i) for (j=1; j<=n; ++j) { cout << " PT hang " << i << " cot " << j << " = "; cin >> a[i][j]; } } void MT::xuat() { int n,i,j; n = this->getN(); if (n) for (int i=1; i<=n; ++i) { cout << "\n" ; for (int j=1; j<=n; ++j) cout << a[i][j] << " "; } } VT MT::operator*(VT x) { VT y; int n,i,j; n = this->getN(); for (i=1; i<=n; ++i) { y.x[i]=0; for (j=1; j<=n; ++j) y.x[i] += a[i][j]*x.x[j]; } 313 314 return y; } void VT::nhap() { int n,i; n = this->getN(); if (n==0) { this->CAP::nhap(); n = this->getN(); } for (i=1; i<=n; ++i) { cout << " PT thu " << i << " = "; cin >> x[i]; } } void VT::xuat() { int n,i; n = this->getN(); if (n) { cout << "\n"; for (int i=1; i<=n; ++i) { cout << x[i] << " "; } } } void main() { MT a; VT x,y; clrscr(); cout<<"\nNhap ma tran A:"; a.nhap(); cout<<"\n\nNhap Vec to X:\n"; x.nhap(); y = a*x; cout<<"\n\nMa tran A"; a.xuat(); cout<<"\n\nVec to X"; x.xuat(); cout<<"\n\nVec to Y=AX"; y.xuat(); getch(); } 315 316 . Từ khái quát đến cụ thể Tính thừa kế cũng thường dùng để thiết kế các bài toán theo hướng từ khái quát đến cụ thể, từ chung đến riêng. Đầu. thực thể sẽ được mô tả bằng một lớp dẫn xuất từ lớp cơ sở này. Sau đây là một số ví dụ minh hoạ: Ví dụ 1 (minh hoạ tư tưởng đi từ khái quát đến cụ thể)