comp.lang.ada
 help / color / mirror / Atom feed
From: "Nick Roberts" <nickroberts@adaos.worldonline.co.uk>
Subject: Re: Sugestion to Multiple Inheritance
Date: Sat, 12 Jan 2002 00:28:44 -0000
Date: 2002-01-12T00:28:44+00:00	[thread overview]
Message-ID: <a1o2gv$sfe3f$4@ID-25716.news.dfncis.de> (raw)
In-Reply-To: slrna3tf3u.kg.lutz@taranis.iks-jena.de

"Lutz Donnerhacke" <lutz@iks-jena.de> wrote in message
news:slrna3tf3u.kg.lutz@taranis.iks-jena.de...

> I'm looking for a design glue to build something like this:
>
>  I have an several (at least two) interfaces with must be implemented
>  by the end user (compiler should require implementation). All of them
>  build a free(!) depedency tree. The simplest one is:
>
>      A -> B     B is an extended A and C is an extended A.
>      |    |     D combines both extensions (requiring both).
>      v    v
>      C -> D
>
>  There are (generic) packages requiring special interfaces.
>
> I'd like to use abstract types and class wide programming, but this can't
be
> done in Ada naturally.


Taking the following example similar to your situation:


  type Respirant is abstract ...;
  procedure Breathe (Animal: in out Respirant; Air: ...);

  type Mammal is abstract new Respirant with ...;
  function Lactate (Animal: in Mammal) return Milk;

  type Arboreal is abstract new Respirant with ...;
  procedure Climb (Animal: in out Arboreal; Tree: ...);

  type Sloth is abstract new Arboreal, Mammal ...; --?


Maybe one solution is as follows:


  type Sloth is abstract new Respirant with ...;

  type Mammal_Aspect   is access all Mammal'Class;
  type Arboreal_Aspect is access all Arboreal'Class;

  function As_Mammal   (Animal: in Sloth) return Mammal_Aspect;
  function As_Arboreal (Animal: in Sloth) return Arboreal_Aspect;

  function Toes (Animal: in Sloth) return Two_Or_Three;


Thus, if you had:


  type Two_Toed_Sloth_As_Mammal is new Mammal with ...;
  -- implement Breathe and Lactate

  type Two_Toed_Sloth_As_Arboreal is new Arboreal with ...;
  -- implement Breathe (again!) and Climb

  type Two_Toed_Sloth is new Sloth with
    record
      Mammalianness: aliased Two_Toed_Sloth_As_Mammal;
      Arboreality:   aliased Two_Toed_Sloth_As_Arboreal;
    end record;

  -- implement Breathe (yet again!!)

  function As_Mammal (Animal: in Two_Toed_Sloth)
        return Mammal_Aspect is
  begin
    return Animal.Mammalianness'Access;
  end;

  function As_Arboreal (Animal: in Two_Toed_Sloth)
        return Arboreal_Aspect is
  begin
    return Animal.Arboreality'Access;
  end;

  function Toes (Animal: in Two_Toed_Sloth)
        return Two_Or_Three is
  begin
    return 2; -- ;-)
  end;


  Jenny: Two_Toed_Sloth;


You could then make Jenny climb to safety:


  Climb( As_Arboreal(Jenny).all, Nice_Tall_Tree );


Ugly, but it works, as they say. Hope this helps!

--
Best wishes,
Nick Roberts






      parent reply	other threads:[~2002-01-12  0:28 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-01-11 10:20 Sugestion to Multiple Inheritance Lutz Donnerhacke
2002-01-11 17:21 ` Stephen Leake
2002-01-11 17:53   ` Lutz Donnerhacke
2002-01-11 19:57     ` Stephen Leake
2002-01-17  8:28       ` Lutz Donnerhacke
2002-01-17 14:31         ` Stephen Leake
2002-01-17 14:54           ` Lutz Donnerhacke
2002-01-17 20:52             ` Jim Rogers
2002-01-11 18:07 ` Mark Lundquist
2002-01-11 18:14 ` Richard Riehle
2002-01-11 20:56   ` Hyman Rosen
2002-01-12  7:35     ` Richard Riehle
2002-01-13  6:37       ` Hyman Rosen
2002-01-14 13:58         ` John English
2002-01-14 16:27           ` Ole-Hjalmar Kristensen
2002-01-12  2:09   ` Will
2002-01-11 22:04 ` Matthew Heaney
2002-01-15 15:32   ` Hyman Rosen
2002-01-15 16:03     ` Lutz Donnerhacke
2002-01-18 19:03       ` Matthew Heaney
2002-01-21 11:23         ` Lutz Donnerhacke
2002-01-21 16:43           ` Brian Rogoff
2002-01-21 17:00             ` Lutz Donnerhacke
2002-01-22 16:55               ` Brian Rogoff
2002-01-23  8:58                 ` Dmitry A. Kazakov
2002-01-25  0:09                   ` Brian Rogoff
2002-01-28 16:23                     ` Dmitry A. Kazakov
2002-01-12  0:28 ` Nick Roberts [this message]
replies disabled

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