Học Pascal

Lập trình hướng đối tượng Pascal – Object

Chúng ta có thể hình dung rằng vũ trụ được tạo từ các đối tượng khác nhau như Mặt Trời, Mặt trăng, Trái Đất,…. Tương tự chúng ta có hình dung một chiếc xe ô tô tạo ra từ các đối tượng như bánh xe, tay lái, phụ tùng,… Tương tự có khái niệm lập trình hương đối tượng(OOP), cho rằng mọi thứ như các đối tượng và việc thực thi phần mềm là sử dụng các đối tượng khác nhau. Trong Pascal, có hai cấu trúc dữ liệu dùng để mô tả một đối tượng thế giới thực:

  • Kiểu đối tượng
  • Kiểu lớp

Khái niệm lập trình hướng đối tượng

Trước khi đi vào chi tiết, chúng ta hãy địng nghĩa các thuật ngữ Pascal quan trọng liên quan đến lập trình hướng đối tượng.

Object( Đối tượng): Một đối tượng là một dạng đặc biệt của bản ghi chứa các trường như bản ghi. Tuy nhiên, không giống như bản ghi, đối tượng chứa các thủ tục và hàm như một phần của nó. Những hàm và thủ tục này được tổ chức như các con trỏ trỏ đến các phương thức kết hợp với kiểu đối tượng.

Class( Lớp): Một lớp được định nghĩa gần như cùng một cách với đối tượng, nhưng có một sự khác biệt trong cách chúng được tạo ra. Lớp được cấp phát trên vùng Heap của chương trình, trong khi đối tượng được cấp phát ở vùng Stack của chương trình. Nó là một con trỏ trỏ đến đối tượng, chứ không phải bản thân là một đối tượng.

Instantiation of a class( Thực thể hóa của lớp): Thực thể hóa nghĩa là tạo một biến có kiểu dữ liệu là lớp. Từ khi lớp chỉ là con trỏ, khi một biến của một kiếu lớp được khai báo, chỉ có bộ nhớ cấp phát cho con trỏ, không phải toàn bộ đối tượng. Chỉ khi nó được thực thể hóa sử dụng một hàm dựng của nó, bộ nhớ mới được cấp phát cho đối tượng. Các thực thể của lớp cũng được gọi là “đối tượng”, nhưng đừng nhầm lẫn chúng với các đối tượng trong Pascal. Trong hướng dẫn này, chúng ta viết “đối tượng” cho đối tượng Pascal và “đối tượng” cho khái niệm đối tượng hay thực thể củ lớp.

Membar Variables( Các biến thành viên): là các biến được định nghĩa bên trong lớp hay đối tượng.

Member Function( Hàm thành viên): là các hàm hay thủ tục được định nghĩa bên trong lớp hay đối tượng và dùng để truy cập dữ liệu của đối tượng.

Visibility of Members ( Tính minh bạch của thành viên): Các thành viên của một đối tượng hay lớp cũng được gọi là các trường. Những trường này có tính minh bạch khác nhau. Tính minh bạch đề cập đến khả năng truy cập của các thành viên tức là, chĩnh xác nơi các thành viên này sẽ được truy cập. Các đối tượng có 3 cấp độ minh bạch: public( công cộng), private( riêng tư) và protected( bảo vệ). Các lớp có 5 kiếu minh bạch: public, private, sticly private( hoàn toàn riêng tư), protected, và published (công khai).

Inherritance( Thừa kế): Khi một lớp được định nghĩa bởi thừa kế các hàm thành viên đã có của một lớp cha nào đó, sau đó nó được nói là thừa kế. Ở đây lớp con sẽ thừa kế toàn bộ hoặc một vài hàm thành viên và các biến của lớp cha. Các lớp cũng có thể được thừa kế.

Parent Class (Lớp cha): là một lớp mà được thừa kế bởi lớp khác. Nó cũng được gọi là lớp cơ sở hay lớp trên.

Child Class( Lớp con): là lớp thừa kế từ lớp khác. Nó cũng được gọi là lớp dưới hay lớp dẫn xuất.

Polymorphism( Tính đa hình): là một khái niệm hướng đối tượng nơi hàm giống nhau có thể được sử dụng cho các mục đích khác nhau. Ví dụ, tên hàm sẽ vẫn còn giống nhau nhưng nó có thể lấy đối số khác nhau và có thể làm công việc khác nhau. Các lớp Pascal thực thi tính đa hình. Các đối tượng không thực thi tính đa hình.

Overloading( Nạp chồng): Nó là một kiếu đa hình trong đó một số hoặc tất cả toán tử có sự thực thi khác nhau phụ thuộc vào các kiểu đối số của chúng. Tương tự các hàm cũng có thể nạp chồng với sự thực thi khác nhau. Các lớp Pascal thực thi nạp chồng, nhưng đối tượng thì không.

Data Abstraction( Sự trừu tượng hóa dữ liệu): Bất kì sự miêu tả dữ liệu nào trong đó sự thực thi chi tiết bị ẩn đi( trừu tượng).

Encapsulation( Sực đóng gói): Đề cập đến khái niệm nơi chúng  tôi đóng gói tất cả biến và hàm thành viên với nhau để tạo thành một đối tượng.

Constructor( Hàm dựng): Đề cập đến một hàm đặc biệt mà nó sẽ được gọi tự động mỗi khi có một đối tượng hình thành từ lớp hay đối tượng.

Destructor (Hàm hủy): Đề cập đến một hàm đặc biệt mà nó sẽ được gọi tự động mỗi khi một đối tượng hay lớp  bị xóa hay đ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 khai báo kiểu. Hình thức chung của một khai báo như sau.

type Kiểu_đối_tượng = object
   private
   Trường1: Kiểu_trường;
   Trường2: Kiểu_trường;
   ...
   public
   procedure proc1;
   function f1(): Kiểu_hàm;
   end;
var Biến_đối_tượng: Kiểu_đối_tượng;

Chúng ta hãy định nghĩa một đối tượng Hình chữ nhật có hai thành viên dữ liệu kiểu nguyên lengthwidth và một vài hàm thành viên để xử lí những dữ liệu thành viên này và một thủ tục để vẽ một hình chữ nhật.

type
   Rectangle = object
   private
      length, width: integer;
   public
      constructor init;
      destructor done;
      procedure setlength(l: inteter);  {Thiết lập chiều dài }
      function getlength(): integer;  {Lấy chiều dài }
      procedure setwidth(w: integer);  { Thiết lập chiều rộng}
      function getwidth(): integer;  {Lấy chiều rộng}
      procedure draw; {Thủ tục vẽ}
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

Sau khi tạo các đối tượng của bạn, 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ẽ có thể xử lý biến thành viên chỉ liên quan đến đối tượng.

Ví dụ sau đây biểu diễn làm thế nào để thiết lập chiều dài và rộng của đối tượng 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à ví dụ sau đầy đủ để thấy 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ó sẽ tạo ra kết quả sau:

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *

Tính minh bạch của các thành viên đối tượng

Tính minh bạch chỉ ra khả năng truy cập của các thành viên đối tượng. Đối tượng Pascal có 2 kiểu minh bạch:

Tính minh bạch Khả năng truy cập
Public Các thành viên các thể được sử dụng bởi các đơn vị bên ngoài chương trình.
Private Các thành viên chỉ có thể được truy cập trong đợn vị hiện tại.
Protected Các thành viên chỉ được truy cập trong đối tượng hậu duệ từ đối tượng cha.

Theo mặc định, các trường và phương thức của một đối tượng được công khai bên ngoài đơn vị hiện tại.

Constructors và Destructors của đối tượng Pascal:

Constructors (Hàm dựng): là các kiểu phương thức đặc biệt, được gọi tự động mỗi khi một đối tượng được tạo ra. Bạn tạo hàm dựng trong Pascal chỉ bằng cách khai báo phương thức bằng từ khóa constrcutor. Bạn có thể truyền nhiều đối số bạn muốn trong hàm dựng.

Destructor (Hàm hủy): là các phương thức được gọi trong khi phá hủy một đối tượng. Các hàm hủy thu hồi bất kì bộ nhớ nào cấp phát bằng hàm dựng.

Ví dụ sau sẽ cung cấp một hàm dựng và một hàm hủy cho lớp Rectangle sẽ khởi tạo chiều dài và chiều rộng cho hignh chữ nhật lúc đối tượng tạo ra và phá hủy khi nó 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ịc và thực thi, nó sẽ 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

Thừa kế của đối tượng Pascal

Các đối tượng Pascal có thề tùy chọn thừa kế từ một đối tượng cha. Chương trình sau đây minh họa thừa kế của các đối tượng Pascal. Hãy tạo một đối tượng khác tên là TableTop, được thừa kế 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à các điểm quan trọng nên chú ý:

  • Đối tượng TableTop đã thừa kế các thành viên của đối tượng Rectangle.
  • Cũng có một phương thức vẽ trong TableTop, khi phương thức vẽ được gọi bằng đối tượng TableTop, phương thức vẽ của TableTop sẽ được gọi.
  • Có một thực thể ẩn có tên là self đề cập tới thực thể 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 đây:

Table Top: 3 by 7
Material: Wood
Calling the Draw Method
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Free Web Hosting