[Object-Oriented + Ada] Bài 2 – Inheritance & Tagged Record

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

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 Coderchild 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_

[Object-Oriented + Ada] Bài 3 – Polymorphism & Type’Class

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ