Ich habe eine Schnittstelle:Wie erstellt man eine anonyme Implementierung einer Schnittstelle?
interface TileSet {
fun contains(x: Int, y: Int) : Boolean
}
Ich möchte in der Lage, Vereinigungen von Mengen von Fliesen zu schaffen (ein Paar von x-Fliese ist und y ganzzahligen Koordinaten):
fun TileSet.union(another: TileSet) : TileSet =
// ..
In Java 8, ich könnte es wie folgt tun:
@FunctionalInterface
public interface TileSet {
boolean contains(int x, int y);
public default TileSet unite(TileSet another) {
return (x, y) -> TileSet.this.contains(x, y) && another.contains(x, y);
}
}
So eine Schnittstelle mit einem Lambda in TileSet#unite()
umgesetzt. Oder es könnte mit dem alten anonymen Klasse Ansatz implementiert werden:
public default TileSet unite(TileSet another) {
return new TileSet() {
@Override
public boolean contains(int x, int y) {
return TileSet.this.contains(x, y) && another.contains(x, y);
}
}
}
Wie kann ich eine anonyme Implementierung einer Single-Methode Schnittstelle in Kotlin erstellen?
Ich weiß, wie es geht, wenn ich (Int, Int) -> Boolean
anstelle von TileSet
verwende, aber ich möchte, dass der Typ einen beschreibenden Namen anstatt nur eine Funktionssignatur hat.
Ich bekomme 'Object muss abstrakt erklärt werden oder abstraktes Element public abstract operator implementieren. – Caipivara
@danielgomezrico Das muss sein, weil Ihre Basisklasse/Interface ('TileSet' in meinem Beispiel) eine abstrakte Methode deklariert, und Sie sollten es in Ihrer anonymen Implementierung implementieren. – gvlasov