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