Phần tiếp theo của câu chuyện OOP trong Ada là chúng ta đang cần định nghĩa cho các kiểu object khác để mô phỏng các nhóm ngành nghề ví dụ như Coder, Teacher, Crafter, v.v… thì về căn bản là chúng ta sẽ muốn mở rộng từ nhóm Person để không phải định nghĩa lại những thông tin chung như Name, Age, Gender, v.v… và các sub-program chỉ làm việc với các trường dữ liệu này. Và chúng ta có tính năng kế thừa Inheritance được Ada 95 hỗ trợ với khái niệm Tagged Record.
Tagged Record
Vẫn là record nhưng có thêm từ khóa tagged được sử dụng để trình biên dịch sẽ gắn một nhãn định danh cho mỗi object được tạo ra khi vận hành phần mềm. Như vậy ở giai đoạn runtime thì trình biên dịch sẽ có thể xác định được object này thuộc cây phả hệ nào.
Và khi một phương thức method được phát động thì trình biên dịch sẽ có thể tìm được primitive trực tiếp của kiểu đó hoặc được kế thừa từ kiểu được định nghĩa trước trong cây phả hệ. Nhờ vậy thì bây giờ chúng ta còn có thể sử dụng thêm cú pháp định nghĩa mở rộng các record đã được định nghĩa trước đó.
package Person is
type Entity is tagged;
-- type definition & sub-program declarations
type Entity is tagged record
Name : String (1 .. 12);
end record;
procedure Greet ...
-- ...
end Person;
with Person; use Person;
package Person.Coder is
type Entity is tagged;
type Class is access all Entity'Class;
-- type definition & sub-program declarations
subtype Bit is Integer range 0 .. 1;
type Entity is new Person.Entity
with record
Intellect : Bit;
end record;
private
-- nothing here
end Person.Coder;
Việc định nghĩa Coder là child package của Person là không bắt buộc để thực hiện cú pháp định nghĩa mở rộng record Person. Tuy nhiên, nếu như chúng ta có định nghĩa thêm các primitive hỗ trợ ở phần private của Person và muốn kế thừa lại để không phải định nghĩa lặp ở Coder thì việc sử dụng child package sẽ là cần thiết.
with Ada.Text_IO; use Ada.Text_IO;
with Person; use Person;
with Person.Coder; use Person.Coder;
procedure Main is
Me : Coder.Class;
Lucy : Person.Class;
begin
Me := new Coder.Entity'
( Name => "Semi Dev_ "
, Intellect => 0 );
Lucy := new Person.Entity'
(Name => "Lucy Bella ");
Me.Greet (Lucy.all);
end Main;
Hi, Lucy
I'm Semi Dev_
Nguồn: viblo.asia
