[Gambas-user] Inheriting, wrapping and casting

Fabien Bodard gambas.fr at ...626...
Thu Apr 17 21:13:41 CEST 2014


Well ... I'm surely not good as you are but I didn't understand the
meanning of castup or down... What is it for ?
Le 17 avr. 2014 21:02, "Bruno Félix Rezende Ribeiro" <oitofelix at ...3320......> a
écrit :

> Hello Gambas fellows!
>
> Suppose we are overriding the class 'Variant[]' to add the event
> 'Update' which will be raised after the completion of any method which
> could possibly modify the array structure.  In particular, we need
> to override appropriately any function that happens to do so.  For
> exposition purposes let's consider the 'Extract' function, which removes
> one or more elements from the array and returns them.  It's signature
> is as follow:
>
>   Public Function Extract(iStart As Integer, \
>     Optional iLength As Integer) As Variant[]
>
> Our inherited class has, hence, to override this function with another
> of the exact same signature, by Gambas' rules.  However, it doesn't
> make sense to return an object of the base class, while the operation
> is executed by a derived class over an object thereof.
>
> It seems there is no easy or natural way around it.  We could declare a
> second extraction function for the derived class named after a different
> symbol like "ExtractDerived", but we'd break the interface, what isn't
> a desired outcome.
>
> Another approach would be to forget this particular base class and go
> upwards until there is no possible conflicting functions and to inherit
> from there, what happens to be in this case the immediate base class of
> 'Variant[]' called "Array".  However, we'd have to re-implement large
> portions of the 'Variant[]' class, that could otherwise be immediately
> deployed if not by our particular design problem at hand.
>
> One last, and arguably more reasonable, approach is to give up the
> syntactical native language's feature of inheritance --- and its useful
> properties -- and to define a dedicated container base class, which
> inherits from nowhere, semantically wrapping all functionality of the
> class 'Variant[]'.  It'd work as a layer for accessing the underlying
> variant array which would be stored in a private variable and isolated
> from the outside world, i.e., not directly accessible by any property.
> The only way to modify the array's content would be to use the
> class' interface which would mimic that of 'Variant[]'.
>
> As we've seen, there is no way if not by modifications of the
> interpreter's very core.  Thus, I'd like to know why Gambas enforces
> the signature of functions onwards inherited classes.  If not by
> technical reasons, but only for methodological consistency requirements,
> I'd like to suggest that we make it, at least, allows to use the
> inherited class in place of the parent class within method signatures.
> Personally, I'd find yet more useful if there were no restriction at
> all.
>
> A very interesting and useful feature, related but independent of this
> suggestion, is that the interpreter could take care of casting objects
> in both directions in an hierarchy of classes.  In order to accomplish
> it, there would be introduced two special methods which would be
> implemented in any class the programmer deems them meaningful and
> useful: '_castUp' and '_castDown', for casting an object from the
> inherited to the parent class, and from the parent to the inherited
> class, respectively.  Being 'ThisClass' the inherited class and
> 'UpClass' its parent, the special methods signatures would be:
>
> Static Public Function _castUp (hThisClass As ThisClass) As UpClass
> Static Public Function _castDown (hUpClass As UpClass) As ThisClass
>
> The job of the interpreter would be to call these functions, in a
> possible chain, to cast automatically upside or downside every time an
> object of certain class is used in a context that requires an object of
> another class but in the same hierarchy.
>
> What are your thoughts on that?
>
>
> Thank you.
>
>
> --
>  ,= ,-_-. =.  Bruno Félix Rezende Ribeiro (oitofelix) [0x28D618AF]
> ((_/)o o(\_)) There is no system but GNU;
>  `-'(. .)`-'  GNU Linux-Libre is one of its official kernels;
>      \_/      All software must be free as in freedom;
>
>
> ------------------------------------------------------------------------------
> Learn Graph Databases - Download FREE O'Reilly Book
> "Graph Databases" is the definitive new guide to graph databases and their
> applications. Written by three acclaimed leaders in the field,
> this first edition is now available. Download your free book today!
> http://p.sf.net/sfu/NeoTech
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user
>
>



More information about the User mailing list