2015-09-04 3 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 (протокол метаобъектов).

С точки зрения непрофессионала, потому что СС является программируемым, так как методы вызываются :)

Как это работает

Следующая диаграмма из Groovy, documentation показывает, как методы ищутся.

Groovy method dispatching for Groovy objects

Что не ясно, на диаграмме, что есть экземпляр метакласса, а также, и это идет перед метакласса класса.

Что-то, что может помочь, это посмотреть на объект или класс .metaClass.methods. Методы, добавленные с помощью наследования, признаков, метакласса и т. Д., Перечислены в плоском списке. Иерархия наследования сглажена. .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" 
+0

Это не дает ответа на вопрос, в любом случае, и должно быть комментарий. Я видел диаграмму, когда читаю полные документы для метапрограммирования. Но эта диаграмма или документы не имеют ничего о иерархии классов. Я прямо упоминал об этом в вопросе. Эта диаграмма касается одного класса и MOP для POGO не иерархии классов. Метакласс класса, а также метакласция экземпляра, хотя и не представленный на этой диаграмме, не связаны с тем, как MOP работает с иерархическими классами. –

+1

См., теперь вы задаете вопрос о том, вопрос. Исходный вопрос, подытоженный: есть ли иерархия метакласса? Теперь вы спрашиваете об иерархии классов (ака. Наследование). Ответ на ваш первый вопрос: да, и его операция кратко описана на диаграмме MOP. Есть ли наследование класса? Да, так же, как Java. НО ... Метод отправки Groovy включает в себя MetaClass, Категории, Черты и Mixins. Они не являются (и не предназначены) иерархическими в смысле ООП с одним диспетчером. Я бы составил целую диаграмму, но, честно говоря, вы были довольно недобрыми. –

+0

После прочтения вашего комментария я перечитываю вопрос. Это не понятно. В основном я хотел знать, как работают вызовы методов, если есть иерархия классов Java, каждая из которых имеет свой собственный метаклас. Но ясно, что вопрос сформулирован неправильно. Прости меня за это. Измените свой ответ.Не отвечайте на вопрос, если вам не хочется, но хотя бы слово, чтобы я мог удалить нижний план. В настоящее время мой голос заблокирован. Я отредактирую вопрос, чтобы улучшить его формулировку. –