Ada_Ru форум

Обсуждение языка Ада

tagged types

Оставить новое сообщение

Сообщения

Oleksandr Havva
tagged types
2002-12-19 10:18:32
hi,

мужики, тут вот интересненькая проблемка обнаружилась,
все просто, но нифига не понятно
(ес-сно, что чего-то я просто не знаю/не понимаю)

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

спецификация простенького пакета:
------------------------------------------------------------
package Simple_Objects  is

    -- тип Root  и его примитивные операции

    type Root is tagged
        record
            Field_1 : Integer;
        end record;

    function The_Name (Self: in Root) return String;
    procedure Show (Self: in Root'Class);


    -- тип Child_1  и его примитивные операции

    type Child_1 is new  Root  with null record;

    function The_Name (Self: in Child_1) return String;


    -- тип Child_2  и его примитивные операции

    type Child_2 is new  Root  with null record;

    function The_Name (Self: in Child_2) return String;

end Simple_Objects;
------------------------------------------------------------


тело этого пакета:
------------------------------------------------------------
with  Ada.Text_IO;

package body Simple_Objects  is

    -- примитивные операции типа Root

    function The_Name (Self: in Root) return String is
    begin
        return ("Root");
    end The_Name;

    procedure Show (Self: in Root'Class) is
    begin
        Ada.Text_IO.Put_Line ( The_Name(Self) );
    end Show;


    -- примитивные операции типа Child_1

    function The_Name (Self: in Child_1) return String is
    begin
        return ("Child_1");
    end The_Name;


    -- примитивные операции типа Child_2

    function The_Name (Self: in Child_2) return String is
    begin
        return ("Child_2");
    end The_Name;

end Simple_Objects;
------------------------------------------------------------

вид элементарной тестовой процедуры:
------------------------------------------------------------
with    Simple_Objects;   use   Simple_Objects;

procedure Test_Simple_Objects is

    Instance  : Root'Class := Child_1'(Field_1 => 0) ;

begin

    Show (Instance);

end Test_Simple_Objects;
------------------------------------------------------------

в таком виде, как оно показано выше,
все это компиляется и работает.

а теперь ВНИМАНИЕ, суть идеи/вопроса:
ежели поменять в спецификации пакета описание типа Root
на пустую запись:

     type Root is tagged null record;

а все расширения записей - нулевые, то есть
объекты не содержат полей

то КАК тогда описать переменную Instance
в Test_Simple_Objects, с условием, что она
_должна_ иметь надклассовый тип Root'Class ???

точнее, ЧТО должно быть написано в качестве
инициализации ???


Alex



Vadim Godunko
Re: [ada_ru] tagged types
2002-12-19 11:25:31
Oleksandr Havva wrote:

> procedure Test_Simple_Objects is
> 
>     Instance  : Root'Class := Child_1'(Field_1 => 0) ;
> 
> begin
> 
>     Show (Instance);
> 
> end Test_Simple_Objects;
> ------------------------------------------------------------

> точнее, ЧТО должно быть написано в качестве
> инициализации ???
> 

А слабо написать так:

    Instance : Root'Class := Child_1'(Root with null record);

?

Вадим
Oleksandr Havva
Re: [ada_ru] tagged types
2002-12-19 11:56:41
hi,

Vadim Godunko wrote:

> А слабо написать так:
>
>     Instance : Root'Class := Child_1'(Root with null record);
>
> ?

мн-дя...

использовать эту форму агрегата -
у меня, видать, извилин не хватило :(

пасиба за подсказку!

>
>
> Вадим

Alex


Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти