comp.lang.ada
 help / color / mirror / Atom feed
From: Jere <jhb.chat@gmail.com>
Subject: Re: How to stop inheritance in a good way?
Date: Wed, 15 Jan 2020 15:19:55 -0800 (PST)
Date: 2020-01-15T15:19:55-08:00	[thread overview]
Message-ID: <a67de3b3-30fb-4ae8-aa84-fe2210d15640@googlegroups.com> (raw)
In-Reply-To: <755521b8-d0a8-41bd-b547-da1136e3b8e1@googlegroups.com>

On Wednesday, January 15, 2020 at 3:32:14 AM UTC-5, reinert wrote:
> Assume I define a tagged record (or interface) + derived types:
> 
>  type int1_t is interface;
>  function A(x : int1_t) return Integer is abstract;
> 
>  type object1_t is abstract new int1_t with private;
>  function A(x : object1_t) return Integer;
>  function B(x : object1_t) return Integer;
> 
>  type object2_1_t is new object1_t with private;
>  function C(x : object2_1_t) return Integer;
> 
>  type object2_2_t is new object1_t with private;
>  function D(x : object2_2_t) return Integer;
> 
> and I want object2_2_t *not* to inherit the function B (from type object1_t).
> I can make a dummy function B for object2_2_t (to override), but is it a more elegant/proper way? Or I here somehow break the concept of inheritance and enter a "dead end" ?
> 
> reinert

It really depends on what you want object2_2_t to "be".  If it truly has a
public "is a" relationship to object1_t, then you have to accept B since
that is part of the "contract" (bad wording I know) of object1_t.  However
if you are ok with object2_2_t being a descendant of int1_t (the origin of
function A), then you can do something like the following (I added
completions to your function so I could get it all to compile):

    package Test is
        type int1_t is interface;
        function A(x : int1_t) return Integer is abstract;
        
        type object1_t is abstract new int1_t with private;
        function A(x : object1_t) return Integer is (0);
        function B(x : object1_t) return Integer is (0);
        
        type object2_1_t is new object1_t with private;
        function C(x : object2_1_t) return Integer is (0);
        
        -- Note the change here
        type object2_2_t is new int1_t with private;
        function D(x : object2_2_t) return Integer is (0); 
    private
    
        type object1_t is abstract new int1_t with null record;
    
        type object2_1_t is new object1_t with null record;

        -- See how the inheritance is listed differently
        type object2_2_t is new object1_t with null record;
    
    end Test;


  parent reply	other threads:[~2020-01-15 23:19 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-15  8:32 How to stop inheritance in a good way? reinert
2020-01-15  9:08 ` Dmitry A. Kazakov
2020-01-15 20:56 ` Randy Brukardt
2020-01-15 23:19 ` Jere [this message]
2020-01-17  9:48   ` reinert
2020-01-17 21:17     ` Optikos
2020-01-17 13:39 ` Shark8
2020-01-20  4:32   ` ric.wai88
2020-01-17 16:56 ` AdaMagica
2020-01-17 23:51   ` Jeffrey R. Carter
replies disabled

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