Đầ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.. 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 t
Trang 1Từ 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 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ái quát đến cụ 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:
Trang 2void 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;
Trang 3void 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];
}
Trang 4return 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";
Trang 5y = 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();
}