Добытчики и сеттеры Ада - PullRequest
0 голосов
/ 01 мая 2018

Я только начал программировать на 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;

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Как сказано выше, обычно задачи не являются обычным способом сделать это. В 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;

Помните, что пример тегового типа также применим к обычным записям и другим частным типам.

0 голосов
/ 01 мая 2018

В случае задачи это довольно просто ... Вы не можете по той же причине, по которой мы ответили в на ваш последний вопрос , задачи могут иметь только записи, которые действуют как способ синхронизации задачи (читать часть на записи и следующие).

Но на самом деле вы могли бы выполнять своего рода геттеры в качестве записей и использовать выборочное ожидание в зависимости от того, когда вы хотите запросить свои атрибуты.

Теперь, что касается установки атрибутов в вашей задаче, использование параметров в начальной записи кажется мне лучшим способом сделать это.

Как примечание, вы пишете об атрибутах классов, но в настоящее время вы вообще не используете классов. Задачи относятся к типу "первокурсник" в Ada и не реализуются через тип класса, как это делается в Java. Использование объектно-ориентированного программирования здесь совсем другое дело.

...