On 15.10.2014 04:21, Hans-Peter Diettrich wrote:
Sven Barth schrieb:

At least at first sight there don't seem to be any real (technical)
reasons to not covariance for return values. Parameters would be a
different topic though...

Just so I get the idea right:

=== code begin ===

type
  TBar = class
    function Test: TObject; virtual;
  end;

  TFooBar = class(TBar)
    function Test: TStrings; override;
  end;

//...

I just wonder about the purpose and use of such refinement. Should the
compiler relate on an more specific return type, based on the *static*
type of an object reference? I'd use different names for specialized
methods/properties instead.

The compiler should take into account the type of the variable on which the method is called. See the example code which you have snipped away. ;)

And btw: the compiler even already does that! :)

OTOH it would be nice to have specialized lists without much coding,
i.e. without writing getters (and setters) which only do typecasts of
their results. Something like

type
   TBar = class
     property Test: TObject ...; virtual;
   end;

   TFooBar = class(TBar)
     property Test: TStrings; override;
   end;

Please note that this kind of override should not require to override
the getters/setters, it only would enforce (static) type checks/casts,
as doable at compile time.

But here the compiler can't guarantee that the Getter behind the property is really a TStrings instead of a TObject. And for the setter we would have the same problem as for methods: if I call the property using a TBar variable and pass something else than a TStrings than the inherited Setter will be called and then (to use the example of a list) a foreign object will reside in the list.

Regards,
Sven
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to