Le 20/04/2013 13:18, Bruce a écrit :
> On Sat, 2013-04-20 at 11:36 +0200, Fabien Bodard wrote:
>> The check is not done for the "_new" special method, as the inheritance of
>> _new is special (see "inheritance and constructor" in the "Gambas object
>> model" documentation on the wiki).
>
> Yep, I know that, but Ian's comment was about overrides for "normal"
> methods. Which still for the sake of sanity I could never understand the
> need for a total ban on signature changes.
>
> I can appreciate that the return type should to some extent be
> "prevented" from overrides, although even that is questionable in cases
> like abstract factories.  As I said at the time, I could not see, nor
> have experienced a situation where gambas has failed where a method is
> overridden in a child class that has a requirement for a different
> signature.
>
> In particular, where an ancestral non-instantiable root class has no
> implementation of some method "XXXX" and the root class is abstract, it
> is fairly easy to specify a method in that class that must be
> overridden. In other words a stub that looks something like this
>
>    Public Sub XXXX(...)
>      Error.Raise(Subst("Incomplete override &1", Object.Class(Me).Name))
>    End
>
> So now I have declared a method in the root class, which MUST be
> overridden in the instantiable child classes, by some method which may
> require {0,1,2,... many} parameters.  As of the fix for Issue 78 this
> doesn't work "nicely", because every override method in a child class
> MUST use the signature "Public Sub XXXX(...)"
>
> The solution I "suggested" to Ian is based on optionally compiling out
> the signature check in gbx-class.c which as I said has not failed for
> about 2 years. I would really love to see an example of where this
> approach could fail because I am still running and promulgating a
> modified version of Gambas locally and to all the clients that has this
> patch in it.
>
> If this sounds like a bit of a rave then I apologise, but "for the sake
> of sanity"...
>
> Anyway, so much for the coffee break, back to rewriting the 64 classes
> to use Ian's "_new()/Init()" approach. Grrrr!
>
> cheers
> Bruce
>

The signature check is actually a bug fix.

Let's suppose that class B inherits class A, and that A has a method 
foo() which is reimplemented in B with a different signature.

Then, calling X.foo() may lead to a crash if X is declared as an A and 
is actually a B, because of an internal optimization that replaces an 
expensive table symbol lookup by a direct method access.

If *all* of the classes of your hierarchy wants a 'Source' and 'Name' 
argument, then these arguments must be defined in the root class 
constructor, not in each one!

If theses twwo arguments must be handled differently between classes, 
then add a public method to handle them. Prefix its name with an 
underscore, to indicate that it must not be called outside of the 
implementation.

' Root class
Public Sub _new(Source as String[], Name as String)
   _Init(Source, Name)
End

' Any child class
Public Sub _Init(Source as String[], Name as String)
   ...
End

Does it fit your needs?

-- 
Benoît Minisini

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr
_______________________________________________
Gambas-user mailing list
Gambas-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gambas-user

Reply via email to