From: David Wallace <averon@argonet.co.uk>
Subject: Can you help with an Ada 95 OO Problem
Date: 1997/01/18
Date: 1997-01-18T00:00:00+00:00 [thread overview]
Message-ID: <na.9173d8474e.a50140averon@argonet.co.uk> (raw)
Hello
I am attempting to get to grip with the new Ada 95 OO extensions, but
appear to be having a problem understanding correctly how views of, and
dispatching of class wide type operations work on procedures which use
an access parameter.
Below is the example code I have been playing with to attempt to use the
features I am experiencing problems with. The Noddy example is based
around a simple OO abstraction of elements of a http protocol.
The problem is described in the example source where the following text
appears.
****** HELP ****
Thanks,
Davsid Wallace.
--
-- Start for main application.
--
with Http;
procedure Start is
begin
Http.STart;
end Start;
--
-- Define Abstract Class to enforce Java/Eiffel style OO representation.
--
package Ada_Classes is
type Ada_Class is abstract tagged null record;
type Ada_Class_Access is access all Ada_Class'Class;
function Create return Ada_Class_Access is abstract;
procedure Init (Obj : access Ada_Class) is abstract;
end Ada_Classes;
--
-- Top Level Http Package
--
package Http is
procedure Start;
end Http;
--
-- Internals to create object instances !!.
--
with Http.Headers.General_Headers;
package body Http is
procedure Start is
General_Header : Http.Headers.General_Headers.General_Header_Access
:=
Http.Headers.General_Headers.Create;
begin
--
-- Initialise an instance of a general Header.
--
-- Here I have attempted to initialise the General Header Instance,
-- which would also attempt to initialise its parent type component.
--
Http.Headers.General_Headers.Init (Obj => General_Header);
end Start;
end Http;
--
-- This package is simply to define the
with Ada_Classes;
package Http.Headers is
type Header is new Ada_Classes.Ada_Class with private;
type Header_Access is access all Header'Class;
function Create return Header_Access;
procedure init(Obj : access Header);
procedure Debug(Obj : access Header);
private
type Header is new Ada_Classes.Ada_Class with
record
Header_Data : Integer;
end record ;
end Http.Headers;
with Text_Io;
package body Http.Headers is
function Create return Header_Access is
New_Header : Header_Access;
begin
Text_Io.Put_Line("Allocatting Header Instance");
New_Header := new Header'(Header_Data => 0);
return New_Header;
end Create;
procedure init(Obj : access Header) is
begin
Text_Io.Put_Line("Header Object has be initialised");
--
-- Initialise the Header Data object with an abritary value.
--
Obj.Header_Data := 4;
end Init;
end Http.Headers;
package Http.Headers.General_Headers is
type General_Header is new Headers.Header with private;
type General_Header_Access is access all General_Header'Class;
function Create return General_Header_Access;
procedure init(Obj : access General_Header);
private
type General_Header is new Headers.Header with
record
General_Header_Data : Integer;
end record ;
end Http.Headers.General_Headers;
with Text_Io;
package body Http.Headers.General_Headers is
function Create return General_Header_Access is
New_General_Header : General_Header_Access;
begin
Text_Io.Put_Line("Allocatting General_Header Instance");
New_General_Header := new General_Header;
return New_General_Header;
end Create;
procedure init(Obj : access General_Header)is
Header_Ref : Header_Access := Obj;
begin
--
-- Init Standard Header Component.
--
Text_Io.Put_Line("General Header initialising Header Object");
-- ***************** HELP *********** HELP ***************************
--
-- This is the crux of the problem.
--
-- How do I get the General_Header to Init the Header component of
-- the parent type Header, using its Init operation.
--
-- The Call below invokes Infinite recursion to the operation,
-- Http.Headers.General_Header, even though the parent operation
-- is referenced.
--
-- I assume the Class Wide Type is using the Tag of the Created object
-- to dispatch on the operation Http.Headers.General_Headers.Init.
-- I initialy believed that the Conversion of Header_Access on the
access
-- parameter would, allow it to have the correct view on the classwide
-- type, and dispatch the appropriate problem.
--
-- Can anybody put me on the right path please. Use of access
parameters
-- on this procedure appears to be confusing the matter. I would
-- appreciate your help, since this problem has been giving me a
headache
-- for a couple of days now.
--
-- NB.
-- I know the Header component is visible from this procedure,
-- and can be directly assigned, but that is not what I am trying
to
-- achieve. This would not have been the case If I had not used
Child
-- Libraries.
--
-- ***************** HELP *********** HELP ***************************
--
Http.Headers.Init(Obj => Header_Ref);
Text_Io.Put_Line("General Header Object has be initialised");
Obj.General_Header_Data := 4;
end Init;
procedure Debug(Obj : access Header)is
begin
Text_Io.Put_Line
("Obj.Header => " &
Integer'Image (Obj.Header_Data));
Text_Io.Put_Line
("Obj.General_Header => " &
Integer'Image (Obj.General_Header_Data));
end Debug;
end Http.Headers.General_Headers;
--
--. --. --. --. : : --- --- .---------------------------------------------.
|_| |_| | _ | | | | |_ | |Internet provider for all Acorn RISC machines|
| | |\ | | | | |\| | | '---------------------------------------------'
| | | \ |_| |_| | | |__ | averon@argonet.co.uk
next reply other threads:[~1997-01-18 0:00 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
1997-01-18 0:00 David Wallace [this message]
1997-01-18 0:00 ` Can you help with an Ada 95 OO Problem Matthew Heaney
1997-01-19 0:00 ` David Wallace
1997-01-21 0:00 ` Can you help with an Ada 95 OO Problem (Solution !!!) David Wallace
1997-01-20 0:00 ` Can you help with an Ada 95 OO Problem Jon S Anthony
1997-01-21 0:00 ` Jerome Desquilbet
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox