Re: Access to function returning class-wide type



Paweł 'Nivertius' Płazieński schrieb:

package B is
type Derived is new A.Abstracted with null record;
function Proc (N : Natural) return Derived;

Failing_Object : A.The_Access_Type := B.Proc'Access;
-- will not compile, error: 'expected type The_Access_Type / found type
access function Proc defined at ...'

(Compiler is right because the profile of B.Proc is different
from that of The_Access_Type (whose functions return Abstracted'Class,
not Derived)

In general, public access types lead to unneccessary complication;
tagged types are by reference already, so you could simply use
dispatching and a factory instead. Do you have spefific needs
for pointers to functions returning by-reference objects?

Or follow Dmitry's advice.


package A is
type Abstracted is abstract tagged null record;
function Proc (N : Natural) return Abstracted is abstract;

package Constructor is
No_Suitable_Type: exception;

function Proc_Wrapper(N : Natural) return Abstracted'Class;
-- create objects of types in Abstracted'Class; the
-- specific type depends on N and other things that are
-- in scope in Constructor's body
end Constructor;

end A;

with A;
package B is
type Derived is new A.Abstracted with null record;
overriding
function Proc (N : Natural) return Derived;
end B;



package body A is
package body Constructor is

function Proc_Wrapper(N : Natural) return Abstracted'Class is
begin
if N > 666 then -- and possibly Some_Other_Condition ...
declare
use B;
begin
return Derived'(Proc(N));
end;
else
--
-- other cases TBD
--
raise No_Suitable_Type;
end if;
end Proc_Wrapper;

end Constructor;
end A;

package body B is
function Proc (N : Natural) return Derived is
begin
return Derived'(null record);
end Proc;
end B;


HTH
--
Georg Bauhaus
Y A Time Drain http://www.9toX.de
.