Pascal - Hướng đối tượng
Chúng ta có thể tưởng tượng vũ trụ của chúng ta được làm từ các vật thể khác nhau như mặt trời, trái đất, mặt trăng, v.v. Tương tự, chúng ta có thể tưởng tượng chiếc xe của chúng ta được làm từ các vật thể khác nhau như bánh xe, tay lái, bánh răng, v.v. Tương tự, có các khái niệm lập trình hướng đối tượng, giả sử mọi thứ như một đối tượng và triển khai một phần mềm bằng cách sử dụng các đối tượng khác nhau. Trong Pascal, có hai kiểu dữ liệu cấu trúc được sử dụng để triển khai một đối tượng thế giới thực:
- Các loại đối tượng
- Các loại lớp
Các khái niệm hướng đối tượng
Trước khi đi vào chi tiết, chúng ta hãy định nghĩa các thuật ngữ Pascal quan trọng liên quan đến Pascal hướng đối tượng.
Object- Một đối tượng là một loại bản ghi đặc biệt có chứa các trường giống như một bản ghi; tuy nhiên, không giống như các bản ghi, các đối tượng chứa các thủ tục và chức năng như một phần của đối tượng. Các thủ tục và hàm này được coi là con trỏ đến các phương thức được liên kết với kiểu của đối tượng.
Class- Một Lớp được định nghĩa gần giống như một Đối tượng, nhưng có sự khác biệt về cách chúng được tạo ra. Lớp được cấp phát trên Heap của một chương trình, trong khi Đối tượng được phân bổ trên Stack. Nó là một con trỏ tới đối tượng, không phải chính đối tượng.
Instantiation of a class- Instantiation nghĩa là tạo một biến của kiểu lớp đó. Vì một lớp chỉ là một con trỏ, khi một biến của kiểu lớp được khai báo, sẽ có bộ nhớ chỉ được cấp phát cho con trỏ chứ không phải cho toàn bộ đối tượng. Chỉ khi nó được khởi tạo bằng một trong các hàm tạo của nó, bộ nhớ mới được cấp phát cho đối tượng. Các thể hiện của một lớp cũng được gọi là 'đối tượng', nhưng đừng nhầm lẫn chúng với Đối tượng Pascal Đối tượng. Trong hướng dẫn này, chúng ta sẽ viết 'Đối tượng' cho Đối tượng Pascal và 'đối tượng' cho đối tượng khái niệm hoặc cá thể lớp.
Member Variables - Đây là các biến được định nghĩa bên trong một Lớp hoặc một Đối tượng.
Member Functions - Đây là các hàm hoặc thủ tục được định nghĩa bên trong một Lớp hoặc một Đối tượng và được sử dụng để truy cập dữ liệu đối tượng.
Visibility of Members- Các thành viên của một Đối tượng hoặc Lớp còn được gọi là các trường. Các lĩnh vực này có tầm nhìn khác nhau. Khả năng hiển thị đề cập đến khả năng tiếp cận của các thành viên, tức là chính xác nơi mà các thành viên này sẽ có thể truy cập được. Đối tượng có ba cấp độ hiển thị: công khai, riêng tư và được bảo vệ. Các lớp có năm kiểu hiển thị: công khai, riêng tư, riêng tư nghiêm ngặt, được bảo vệ và xuất bản. Chúng tôi sẽ thảo luận về khả năng hiển thị chi tiết.
Inheritance- Khi một Lớp được định nghĩa bằng cách kế thừa các chức năng hiện có của Lớp cha, thì nó được cho là được kế thừa. Ở đây lớp con sẽ kế thừa tất cả hoặc một vài hàm thành viên và các biến của một lớp cha. Các đối tượng cũng có thể được kế thừa.
Parent Class- Một Lớp được kế thừa bởi Lớp khác. Đây còn được gọi là lớp cơ sở hoặc siêu lớp.
Child Class- Một lớp kế thừa từ một lớp khác. Đây còn được gọi là lớp con hoặc lớp dẫn xuất.
Polymorphism- Đây là một khái niệm hướng đối tượng trong đó cùng một chức năng có thể được sử dụng cho các mục đích khác nhau. Ví dụ: tên hàm sẽ giữ nguyên nhưng nó có thể có số lượng đối số khác nhau và có thể thực hiện các tác vụ khác nhau. Các lớp Pascal thực hiện tính đa hình. Các đối tượng không triển khai tính đa hình.
Overloading- Đây là một kiểu đa hình trong đó một số hoặc tất cả các toán tử có cách triển khai khác nhau tùy thuộc vào kiểu đối số của chúng. Tương tự, các chức năng cũng có thể được nạp chồng với các cách triển khai khác nhau. Các lớp Pascal thực hiện nạp chồng, nhưng các Đối tượng thì không.
Data Abstraction - Bất kỳ biểu diễn dữ liệu nào trong đó các chi tiết triển khai được ẩn (trừu tượng hóa).
Encapsulation - Đề cập đến một khái niệm trong đó chúng ta đóng gói tất cả dữ liệu và các hàm thành viên lại với nhau để tạo thành một đối tượng.
Constructor - Đề cập đến một loại chức năng đặc biệt sẽ được gọi tự động bất cứ khi nào có sự hình thành đối tượng từ một lớp hoặc một Đối tượng.
Destructor - Đề cập đến một loại chức năng đặc biệt sẽ được gọi tự động bất cứ khi nào một Đối tượng hoặc Lớp bị xóa hoặc đi ra khỏi phạm vi.
Định nghĩa các đối tượng Pascal
Một đối tượng được khai báo bằng cách sử dụng khai báo kiểu. Dạng tổng quát của một khai báo đối tượng như sau:
type object-identifier = object
private
field1 : field-type;
field2 : field-type;
...
public
procedure proc1;
function f1(): function-type;
end;
var objectvar : object-identifier;
Hãy để chúng tôi xác định một Đối tượng Hình chữ nhật có hai thành viên dữ liệu kiểu số nguyên - length và width và một số hàm thành viên để thao tác với các thành viên dữ liệu này và một thủ tục để vẽ hình chữ nhật.
type
Rectangle = object
private
length, width: integer;
public
constructor init;
destructor done;
procedure setlength(l: inteter);
function getlength(): integer;
procedure setwidth(w: integer);
function getwidth(): integer;
procedure draw;
end;
var
r1: Rectangle;
pr1: ^Rectangle;
Sau khi tạo các đối tượng của mình, bạn sẽ có thể gọi các hàm thành viên liên quan đến đối tượng đó. Một hàm thành viên sẽ chỉ có thể xử lý biến thành viên của đối tượng liên quan.
Ví dụ sau đây cho thấy cách thiết lập chiều dài và chiều rộng cho hai đối tượng hình chữ nhật và vẽ chúng bằng cách gọi các hàm thành viên.
r1.setlength(3);
r1.setwidth(7);
writeln(' Draw a rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1);
pr1^.setlength(5);
pr1^.setwidth(4);
writeln(' Draw a rectangle: ', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);
Sau đây là một ví dụ đầy đủ để chỉ ra cách sử dụng các đối tượng trong Pascal:
program exObjects;
type
Rectangle = object
private
length, width: integer;
public
procedure setlength(l: integer);
function getlength(): integer;
procedure setwidth(w: integer);
function getwidth(): integer;
procedure draw;
end;
var
r1: Rectangle;
pr1: ^Rectangle;
procedure Rectangle.setlength(l: integer);
begin
length := l;
end;
procedure Rectangle.setwidth(w: integer);
begin
width :=w;
end;
function Rectangle.getlength(): integer;
begin
getlength := length;
end;
function Rectangle.getwidth(): integer;
begin
getwidth := width;
end;
procedure Rectangle.draw;
var
i, j: integer;
begin
for i:= 1 to length do
begin
for j:= 1 to width do
write(' * ');
writeln;
end;
end;
begin
r1.setlength(3);
r1.setwidth(7);
writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1);
pr1^.setlength(5);
pr1^.setwidth(4);
writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);
end.
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Khả năng hiển thị của các thành viên đối tượng
Khả năng hiển thị cho biết khả năng tiếp cận của các thành viên đối tượng. Các thành viên đối tượng Pascal có ba kiểu hiển thị:
Sr.No | Khả năng hiển thị & Khả năng tiếp cận |
---|---|
1 | Public Các thành viên có thể được sử dụng bởi các đơn vị khác ngoài đơn vị chương trình |
2 | Private Các thành viên chỉ có thể truy cập trong đơn vị hiện tại. |
3 | Protected Các thành viên chỉ có sẵn cho các đối tượng xuất phát từ đối tượng mẹ. |
Theo mặc định, các trường và phương thức của một đối tượng là công khai và được xuất ra bên ngoài đơn vị hiện tại.
Các hàm tạo và hủy cho các đối tượng Pascal -
Constructorslà loại phương thức đặc biệt, được gọi tự động bất cứ khi nào một đối tượng được tạo. Bạn tạo một hàm tạo trong Pascal chỉ bằng cách khai báo một phương thức với một hàm tạo từ khóa. Thông thường, tên phương thức là Init, tuy nhiên, bạn có thể cung cấp bất kỳ số nhận dạng hợp lệ nào của riêng mình. Bạn có thể truyền bao nhiêu đối số tùy thích vào hàm khởi tạo.
Destructorslà các phương thức được gọi trong quá trình phá hủy đối tượng. Các phương thức của hàm hủy sẽ phá hủy mọi cấp phát bộ nhớ được tạo bởi các hàm tạo.
Ví dụ sau sẽ cung cấp một hàm tạo và một hàm hủy cho lớp Rectangle, lớp này sẽ khởi tạo chiều dài và chiều rộng cho hình chữ nhật tại thời điểm tạo đối tượng và hủy nó khi nó vượt ra khỏi phạm vi.
program exObjects;
type
Rectangle = object
private
length, width: integer;
public
constructor init(l, w: integer);
destructor done;
procedure setlength(l: integer);
function getlength(): integer;
procedure setwidth(w: integer);
function getwidth(): integer;
procedure draw;
end;
var
r1: Rectangle;
pr1: ^Rectangle;
constructor Rectangle.init(l, w: integer);
begin
length := l;
width := w;
end;
destructor Rectangle.done;
begin
writeln(' Desctructor Called');
end;
procedure Rectangle.setlength(l: integer);
begin
length := l;
end;
procedure Rectangle.setwidth(w: integer);
begin
width :=w;
end;
function Rectangle.getlength(): integer;
begin
getlength := length;
end;
function Rectangle.getwidth(): integer;
begin
getwidth := width;
end;
procedure Rectangle.draw;
var
i, j: integer;
begin
for i:= 1 to length do
begin
for j:= 1 to width do
write(' * ');
writeln;
end;
end;
begin
r1.init(3, 7);
writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1, init(5, 4));
writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth());
pr1^.draw;
pr1^.init(7, 9);
writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);
r1.done;
end.
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Draw a rectangle: 7 by 9
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Destructor Called
Kế thừa cho các đối tượng Pascal
Các đối tượng Pascal có thể kế thừa từ một đối tượng cha. Chương trình sau đây minh họa sự kế thừa trong các đối tượng Pascal. Hãy để chúng tôi tạo một đối tượng khác có tênTableTop, được kế thừa từ đối tượng Rectangle.
program exObjects;
type
Rectangle = object
private
length, width: integer;
public
procedure setlength(l: integer);
function getlength(): integer;
procedure setwidth(w: integer);
function getwidth(): integer;
procedure draw;
end;
TableTop = object (Rectangle)
private
material: string;
public
function getmaterial(): string;
procedure setmaterial( m: string);
procedure displaydetails;
procedure draw;
end;
var
tt1: TableTop;
procedure Rectangle.setlength(l: integer);
begin
length := l;
end;
procedure Rectangle.setwidth(w: integer);
begin
width :=w;
end;
function Rectangle.getlength(): integer;
begin
getlength := length;
end;
function Rectangle.getwidth():integer;
begin
getwidth := width;
end;
procedure Rectangle.draw;
var
i, j: integer;
begin
for i:= 1 to length do
begin
for j:= 1 to width do
write(' * ');
writeln;
end;
end;
function TableTop.getmaterial(): string;
begin
getmaterial := material;
end;
procedure TableTop.setmaterial( m: string);
begin
material := m;
end;
procedure TableTop.displaydetails;
begin
writeln('Table Top: ', self.getlength(), ' by ' , self.getwidth());
writeln('Material: ', self.getmaterial());
end;
procedure TableTop.draw();
var
i, j: integer;
begin
for i:= 1 to length do
begin
for j:= 1 to width do
write(' * ');
writeln;
end;
writeln('Material: ', material);
end;
begin
tt1.setlength(3);
tt1.setwidth(7);
tt1.setmaterial('Wood');
tt1.displaydetails();
writeln;
writeln('Calling the Draw method');
tt1.draw();
end.
Sau đây là những điểm quan trọng cần được lưu ý:
Đối tượng Tabletop đã kế thừa tất cả các thành viên của đối tượng Rectangle.
Cũng có một phương pháp hòa trong TableTop . Khi bốc thăm phương pháp được gọi là sử dụng một bàn đối tượng, bốc thăm bàn của bị gọi.
Có một trường hợp ngầm được đặt tên là self mà đề cập đến phiên bản hiện tại của đối tượng.
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Table Top: 3 by 7
Material: Wood
Calling the Draw Method
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood