comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: How to check class type ?
Date: Wed, 21 Apr 2021 19:40:25 +0200	[thread overview]
Message-ID: <s5po26$5fk$1@gioia.aioe.org> (raw)
In-Reply-To: 60805c0e$0$12690$426a74cc@news.free.fr

On 2021-04-21 19:08, DrPi wrote:
> Hi,
> 
> I have the following declarations (just for the example) :
> 
> type Root is tagged null record;
> type Root_Ptr is access all Root'Class;
> 
> type Leaf1 is new Root with null record;
> type Leaf1_Ptr is access all Leaf1'Class;
> 
> type Leaf2 is new Root with null record;
> type Leaf2_Ptr is access all Leaf2'Class;
> 
> 
> To check if a variable is of type Leaf1_Ptr or Leaf2_Ptr, I do :

That does not make sense, Leaf1_Ptr is not tagged.

> if var'Tag = Leaf1'Tag then
>    ...
> elsif var'Tag = Leaf2'Tag then
>    ...
> end if;


    if Var in Leaf1'Class then
       ... -- Class rooted in Leaf1
    elsif Var in Leaf2'Class then
       ... -- Class rooted in Leaf2

> It works. But is this correct ? Should the test be done differently to 
> suit Ada coding style ?

It depends on the intent. Usually you should never check for the class 
except two cases:

1. Defensive programming of a downcast:

    if X in T'Class then
       declare
          Y : T'Class renames T'Class (X);
       begin
          ...
       end;

Downcasts are by themselves problematic, to be avoided when possible.

2. Emulation of multiple dispatch.

In most cases you leave all tag checks to dispatch.

This may lead to so-called God-classes when primitive operations migrate 
to the root. E.g. if you had a primitive Foo on Leaf1, but not in Leaf2 
and the purpose of check would be if you could call to Foo, you might 
move Foo as abstract to Root and override it as raising exception in 
Leaf2. Then instead of checking for the tag, you would simply dispatch:

    Var.Foo; -- Will raise if not Leaf1

This would be a God-class case.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

  parent reply	other threads:[~2021-04-21 17:40 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-21 17:08 How to check class type ? DrPi
2021-04-21 17:26 ` AdaMagica
2021-04-21 17:33   ` DrPi
2021-04-21 17:48   ` DrPi
2021-04-23 16:13     ` John McCabe
2021-04-21 17:40 ` Dmitry A. Kazakov [this message]
2021-04-22  8:50   ` DrPi
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox