Groovy « comme » mot-clé pour mettre en œuvre 2+ interfaces
-
28-09-2019 - |
Question
Je voudrais mettre en œuvre une liste baie vitrée qui a à la fois une interface AdvancedTableFormat et WritableTableFormat.
Je lis ici: http://www.jroller.com/aalmiray/entry/glazedlists_groovy_not_your_regular
et pour une interface, il semble que ce soit possible Groovy avec le mot-clé « comme »:
# return new EventTableModel(linksList, [
# getColumnCount: {columnNames.size()},
# getColumnName: {index -> columnNames[index]},
# getColumnValue: {object, index ->
# object."${columnNames[index].toLowerCase()}"
# }] as TableFormat)
Est-il possible d'une certaine manière de faire cela pour deux interfaces? Si oui, comment?
Merci!
Misha
La solution
Vous pouvez créer une nouvelle interface qui étend les deux interfaces qui vous intéressent.
interface PersonalizedTableFormat extends AdvancedTableFormat, WriteableTableFormat {
}
Vous pouvez lancer l'objet que vous revenez à la nouvelle interface.
return object as PersonalizedTableFormat;
Autres conseils
Le mot-clé « comme » est juste une façon de fantaisie d'invoquer Groovy asType (classe) méthode , qui prend qu'une seule classe comme argument. Par conséquent, vous ne pouvez pas utiliser directement « comme » avec plus d'une interface (sauf si vous prenez l'approche de FRM et combiner les interfaces dans une interface super).
Je me demande si vous souhaitez implémenter 2 ou plusieurs interfaces à la volée, et ne préfère pas « code dur » comme
interface abc extends aaa,bbb,ccc {}
?
Peut être vous pouvez essayer le code suivant:
import static java.util.Collections.sort
def doClose(Closeable c){
c.close();
}
def o = new Object()
o.metaClass{
compare{Object a,String b-> return a.size() - b.size()};
close{println 'Lights out - I am closing'};
}
o = new ProxyGenerator().instantiateDelegate([Comparator, Closeable], o)
def items = ['a', 'bbb', 'cc']
sort(items, o);
println items;
doClose(o);
println o.class.getInterfaces();