[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

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,