方法调用在groovy中的工作顺序是什么?

方法调用在groovy中的工作顺序是什么?,groovy,metaprogramming,metaclass,Groovy,Metaprogramming,Metaclass,我正在使用groovy 2.3.8 我试图弄清楚方法调用在groovy中是如何工作的。具体来说,如果我们有一个Java类层次结构,每个层次结构都有一个元类,如下所示 class A { } A.metaClass.hello = { "hello superclass" } class B extends A { } B.metaClass.hello = { "hello subclass" } 如果我使用newb().hello()我会得到hello子类。如果我删除B的元类,那么

我正在使用groovy 2.3.8

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

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

class B extends A {
}
B.metaClass.hello = {
  "hello subclass"
}
如果我使用
newb().hello()
我会得到
hello子类
。如果我删除B的元类,那么我会得到
hello超类

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

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

那么groovy如何查找要调用的方法呢?

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

用外行的话说,因为MOP是可编程的,所以调用方法的方式也是可编程的:)

工作原理 Groovy的下图显示了如何查找方法

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

查看对象或类的
.metaClass可能会有所帮助。通过继承、特征、元类等添加的方法将列在一个简单的列表中。继承层次结构被展平<另一方面,code>.metaClass.metaMethods
似乎包含通过GDK添加的方法。从列表中,我无法判断方法优先级:(

根据观察,规则似乎是这样的:最后一个元类站着赢

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,而不是类层次结构.Class元类和instance元类虽然未在本图中表示,但与MOP如何处理分层类也没有关系。请看,现在您提出了一个不同的问题。原始问题总结为:是否存在元类层次结构?现在您提出的是类层次结构(又名.inheritation)。您的第一个问题的答案是肯定的,它的操作在MOP图中有简要描述。是否存在类继承?是的,与Java相同。但是…Groovy的方法分派包括元类、类别、特征和混合。这些不是(也不打算是这样的)OOP单一分派意义上的层次结构。我本来会整理一个完整的图表,但老实说,你相当不友好。在阅读了你的评论后,我重新阅读了这个问题。这并不清楚。我基本上想知道,如果Java类层次结构中每个都有自己的元类,方法调用是如何工作的。但很明显问题的措辞不正确。请原谅我。请编辑您的答案。如果您不喜欢,请不要回答该问题,但至少要回答一个字,以便我可以删除否决票。目前我的投票被锁定。我将编辑该问题以改进其措辞。