2015-09-04 20 views
1

我正在使用groovy 2.3.8方法调用groovy中的哪个序列?

我想弄清楚方法调用如何在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

基于改变上述例子中,我认为常规云在以下顺序找到调用哪个方法

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

那么,如何查找常规调用哪个方法?

回答

0

那么,层次结构是预期的面向对象的编程方法重载,这是你目睹的。调度有什么不同。它不是从实例类中的方法查找开始,而是从MOP(元对象协议)开始。

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

它是如何工作

从Groovy的documentation下图显示方法是什么样子了。

Groovy method dispatching for Groovy objects

什么不图中清楚的是,有一个实例元类为好,它的类的元类之前。

东西可能有助于查看对象或类的.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" 
+0

这不回答这个问题以任何方式和应当我正在阅读完整的元编程文档时,我已经看到了这个图表,但是这个图表或文档没有关于类层次结构的任何内容,我在这个问题中明确提到了这个图表是关于单个类和MOP对于POGO而言,不是类层次结构类图元类和实例元类虽然在此图中未表示,但与MOP如何与分层类一起工作也不相关 –

+1

请参阅,现在您要求的是不同的问题。最初的问题总结为:是否存在元类层次结构?现在你在问一个类的层次结构(又名继承)。你的第一个问题的答案是肯定的,它的操作在MOP图中简要描述。有没有类继承?是的,和Java一样。但是...... Groovy的方法调度包括MetaClass,Categories,Traits和Mixins。这些不是(也不打算是)在OOP单调度意义上的分层结构。我会整理一个完整的图表,但是,老实说,你一直都很不友好。 –

+0

阅读你的评论后,我重新阅读了这个问题。不清楚。我基本上想知道如果有一个Java类层次结构,每个类都有自己的元类,方法调用是如何工作的。但显然这个问题措辞不正确。请原谅我。请编辑你的答案。不要回答这个问题,如果你不喜欢它,但至少有一个词,所以我可以删除downvote。目前我的投票被锁定。我将编辑该问题以改进其措辞。 –

相关问题