2015-11-05 7 views
21

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.

Antwort

34

Es gibt Beispiele in der documentation für anonyme Klassen, aber nicht für Schnittstellen. Diese

ist, wie ich eine Instanz einer Schnittstelle erstellt:

fun TileSet.union(another: TileSet) : TileSet = 
    object : TileSet { 
     override fun contains(x: Int, y: Int) : Boolean = 
      [email protected](x, y) || another.contains(x, y) 
    } 

Beachten Sie, dass im Gegensatz zum Beispiel aus der Dokumentation gibt es keine Klammern nach object : TileSet.

+0

Ich bekomme 'Object muss abstrakt erklärt werden oder abstraktes Element public abstract operator implementieren. – Caipivara

+2

@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

Verwandte Themen