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 - lengthwidth 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