Я только начал программировать на Ada, и мне было интересно, как запрограммировать геттеры и сеттеры для работы с атрибутами классов.
На самом деле я заинтересован в получении геттеров и сеттеров атрибутов deadline
, period
и computingTime
следующего пакета:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Real_Time; use Ada.Real_Time;
package body pkg_tasks is
task body task_a is
deadline : Time_Span := To_Time_Span(25.0);
period : Time_Span := To_Time_Span(25.0);
computingTime : Time_Span := To_Time_Span(10.0);
startingTime : Time;
begin
entry start do
startingTime := Clock;
while (Clock - startingTime) < computingTime loop
end loop;
New_line;
Put_Line("End of task A");
end start;
end task_a;
end pkg_tasks;
В случае задачи это довольно просто ... Вы не можете по той же причине, что мы ответили в твой последний вопрос, задачи могут иметь только записи, которые действуют как способ синхронизации задач (прочтите часть по записям и последующие).
Но на самом деле вы можете выполнять своего рода геттеры как записи и использовать выборочное ожидание в зависимости от того, когда вы хотите запросить свои атрибуты.
Теперь о настройке атрибутов вашей задачи, использование параметров в вашей начальной записи кажется мне лучшим способом сделать.
Обратите внимание: вы пишете об атрибутах классов, но в настоящее время вы вообще не используете классы. Задачи являются типом первого гражданина в Ada и не реализуются через тип класса, как это делается в Java. Другое дело использование объектно-ориентированного программирования.
Как было сказано выше, обычно задачи не являются нормальным способом. Еще в Ada83 не было защищенных типов, поэтому, если вам нужно что-то подобное, вы эмулировали это с помощью задачи. Кроме того, вот несколько примеров использования задач, защищенных типов и классов (или, как их называет Ада, тегированных типов):
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Real_Time; use Ada.Real_Time;
procedure jdoodle is
------------------------------------------------------
-- Task Example
------------------------------------------------------
task Task_Example is
entry Get(Time : out Time_Span);
entry Set(Time : in Time_Span);
end Task_Example;
task body Task_Example is
Value : Time_Span := To_Time_Span(0.0);
begin
loop
select
accept Get(Time : out Time_Span) do
Time := Value;
end Get;
or
accept Set(Time : in Time_Span) do
Value := Time;
end Set;
or
terminate;
end select;
end loop;
end Task_Example;
------------------------------------------------------
-- Protected type example
------------------------------------------------------
protected type Protected_Example is
procedure Put(Time : Time_Span); -- or use entry
function Get return Time_Span; -- or use procedure or entry
private
Value : Time_Span := To_Time_Span(0.0);
end Protected_Example;
protected body Protected_Example is
procedure Put(Time : Time_Span) is
begin
Value := Time;
end Put;
function Get return Time_Span is
begin
return Value;
end Get;
end Protected_Example;
------------------------------------------------------
-- Class Example
------------------------------------------------------
package Classes is
type Class_Example is tagged limited private;
procedure Put(Self : in out Class_Example; Time : Time_Span);
function Get(Self : in Class_Example) return Time_Span; -- or use procedure
private
type Class_Example is tagged limited record
Value : Time_Span := To_Time_Span(0.0);
end record;
end Classes;
package body Classes is
procedure Put(Self : in out Class_Example; Time : Time_Span) is
begin
Self.Value := Time;
end Put;
function Get(Self : in Class_Example) return Time_Span is
begin
return Self.Value;
end Get;
end Classes;
begin
Put_Line("Starting");
end jdoodle;
Имейте в виду, что пример помеченного типа также применим к обычным записям и другим частным типам.
Хорошо, спасибо за уделенное время. Как видите, я здесь совсем нубик, ха-ха