You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Jan Šmucr (JIRA)" <ji...@apache.org> on 2018/01/29 09:40:00 UTC

[jira] [Commented] (GROOVY-3942) Using metaClass to override methods in class hierarchy does not work as expected

    [ https://issues.apache.org/jira/browse/GROOVY-3942?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16343137#comment-16343137 ] 

Jan Šmucr commented on GROOVY-3942:
-----------------------------------

Just ran into this and trying to figure out some workaround. :(

> Using metaClass to override methods in class hierarchy does not work as expected
> --------------------------------------------------------------------------------
>
>                 Key: GROOVY-3942
>                 URL: https://issues.apache.org/jira/browse/GROOVY-3942
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 1.8-beta-1
>         Environment: Windows XP
>            Reporter: Alex McManus
>            Priority: Major
>         Attachments: MetaclassOverrideTest.groovy
>
>
> I've found some strange behaviour when dynamically overriding methods that are called in a class hierarchy, which I think might be a bug. The problem is that when I override a method on a subclass, code in the superclass still calls the original method (note all classes are Groovy ones, I know this wouldn't work with a Java class hierarchy).
> I've isolated it to this sample code:
> {code:Java}
>     class BaseClass {
>         def baseClassMethod() {
>             println "BaseClass.baseClassMethod()"
>             internalMethod()
>         }
>         def internalMethod() {
>            println "    BaseClass.internalMethod()"
>         }
>     }
>     class SubClass extends BaseClass {
>         def subClassMethod() {
>             println "SubClass.subClassMethod()"
>             internalMethod()
>         }
>     }
>     def subClass = new SubClass()
>     subClass.metaClass.internalMethod = { -> println ("    (dynamic).internalMethod()")}
>     subClass.baseClassMethod()
>     subClass.subClassMethod()
> {code}
> ...which gives me the following output...
>     BaseClass.baseClassMethod()
>         BaseClass.internalMethod()
>     SubClass.subClassMethod()
>         (dynamic).internalMethod()
> I would have expected that the dynamic version of internalMethod() would be called both times, given that Groovy has dynamic method dispatching.
> Some discussion of this issue took place on the mailing list: http://old.nabble.com/Problems-using-metaClass-to-override-methods-in-class-hierarchy-td26743895.html#a26743895
> The suggestion is that the CallSiteArray.createCallCurrentSite(...) method could check whether the receiver is a sub class of the sender class.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)