with Ada.Streams; use Ada.Streams; package abstract1 is type T is abstract tagged limited null record; function Input (Stream : not null access Root_Stream_Type'Class) return T is abstract; function New_T (Stream : not null access Root_Stream_Type'Class) return T'Class; type IT is limited new T with record I : Integer; end record; function Input (Stream : not null access Root_Stream_Type'Class) return IT; type FT is limited new T with record F : Float; end record; function Input (Stream : not null access Root_Stream_Type'Class) return FT; end abstract1;