【问题标题】:In which sequence does method call work in groovy?方法调用在 groovy 中按什么顺序工作?
【发布时间】:2015-12-01 01:20:05
【问题描述】:

我正在使用 groovy 2.3.8

我试图弄清楚方法调用如何在 groovy 中工作。具体来说,如果我们有一个 Java 类层次结构,每个层次结构都有一个metaClass,如下所示

class A {
}
A.metaClass.hello = {
  "hello superclass"
}

class B extends A {
}
B.metaClass.hello = {
  "hello subclass"
}

如果我使用new B().hello(),我会得到hello subclass。如果我删除 B 的元类,那么我会得到 hello superclass

基于更改上面的示例,我认为 groovy 会按以下顺序查找要调用的方法

method-in-subclass's-metaclass ?: subclass-metho  ?: method-in-superclass's metaclass ?: method-in-superclass

那么 groovy 是如何查找调用哪个方法的呢?

【问题讨论】:

    标签: groovy metaprogramming metaclass


    【解决方案1】:

    嗯,层次结构是预期的面向对象编程方法重载,这就是您所见证的。不同的是调度。它不是从实例类中的方法查找开始,而是从MOP(元对象协议)开始。

    通俗地说,因为 MOP 是可编程的,所以调用方法的方式也是如此 :)

    工作原理

    Groovy 的documentation 中的下图显示了如何查找方法。

    图中不清楚的是,还有一个实例元类,它位于类的元类之前。

    查看对象或类的.metaClass.methods 可能会有所帮助,通过继承、特征、元类等添加的方法列在一个平面列表中。继承层次结构是扁平的。另一方面,.metaClass.metaMethods 似乎包含通过 GDK 添加的方法。从列表中我无法分辨方法优先级:(

    根据观察,规则似乎是这样的:最后一个 MetaClass 获胜。

    class A { }
    
    class B extends A { }
    
    A.metaClass.hello = {
      "hello superclass"
    }
    
    B.metaClass.hello = {
      "hello subclass"
    }
    
    def b = new B()
    
    assert b.hello() ==  "hello subclass"
    b.metaClass = A.metaClass
    assert b.hello() ==  "hello superclass"
    

    【讨论】:

    • 这不会以任何方式回答问题,应该是评论。在阅读元编程的完整文档时,我已经看到了该图。但是这个图或文档没有关于类层次结构的任何内容。我在问题中明确提到了这一点。该图是关于 POGO 的单个类和 MOP,而不是类层次结构。类元类和实例元类虽然未在此图中表示,但也与 MOP 与分层类的工作方式无关。
    • 看,现在你问的是另一个问题。最初的问题,总结:是否存在元类层次结构?现在你在问一个类层次结构(又名继承)。您的第一个问题的答案是肯定的,它的操作在 MOP 图中进行了简要描述。有类继承吗?是的,和Java一样。但是... Groovy 的方法分派包括 MetaClass、Categories、Traits 和 Mixins。在 OOP 单调度意义上,这些不是(也不打算是)分层的。我会整理出一个完整的图表,但老实说,你相当不友善。
    • 阅读您的评论后,我重新阅读了这个问题。不清楚。我基本上想知道方法调用是如何工作的,以防有一个 Java 类层次结构,每个层次结构都有自己的元类。但显然这个问题的措辞不正确。请原谅我。请编辑您的答案。如果您不喜欢,请不要回答这个问题,但至少要回答一个字,这样我就可以删除反对票。目前我的投票被锁定。我将编辑问题以改进其措辞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2015-12-30
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多