Mateusz Mrozewski
unread,Dec 14, 2009, 3:55:36 AM12/14/09Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to jug-tro...@googlegroups.com
Witam,
Jedną z rzeczy, której nie byłem w stanie dokładnie wytłumaczyć na
prezentacji była konstrukcja:
import grails.converters.XML
...
def t= Task.get(1)
render t as XML
Ta konstrukcja pozwala nam przekazać klasę domenową (encję) do metody
render jako XML. Zarówno metoda render, klasa domenowa oraz klasa
grails.converters.XML są klasami Grails i zostały tak skonstrukowane,
żeby ta konwersja mogła się odbyć (tj. metoda render wie jak
wyświetlić grails.converters.XML, a klasa domenowa wie jak
"przetłumaczyć się" na grails.converters.XML).
Natomiast samo słowo kluczowe "as" jest cechą Groovy (operatorem). W
Groovy'm każdy operator "pod maską" wywołuje odpowiednią metodę, np. +
wywołuje plus, - wywołuje minus, itp. (tak, można dzięki temu
przeciążać operatory). Operator "as" wywołuje metodę asType(). Żeby
lepiej to zobrazować, mały fragment kodu:
class Bar {
String a
public Bar(String a) {
this.a = a
}
public String toString() {
"[a: " + a + "]"
}
}
Tak wygląda nasza klasa Bar. Klasa Foo wygląda tak:
class Foo {
public Bar asType(Class<Bar> a) {
new Bar("Test")
}
}
W klasie Foo definiujemy metodę asType i oczekujemy jej wywołania z
klasą Bar. Gdy takie wywołanie nastąpi zwracamy nową instancję klasy
Bar (oczywiście w prawdziwym kodzie w tym miejscu nastąpiłaby sprytna
konwersja ;-). Wywołujemy to tak:
class Main {
public static void main(String[] args) {
def f = new Foo()
myRender f as Bar
}
private static void myRender(Bar b) {
println b
}
}
Do metody myRender przekazujemy instancję klasy Bar, która została
utworzona w wyniku konwersji "f as Bar".
pozdrawiam
--
Mateusz Mrozewski