2015-11-05 19 views
21

Tôi có một giao diện:Làm thế nào để tạo ra một triển khai nặc danh của một giao diện?

interface TileSet { 
    fun contains(x: Int, y: Int) : Boolean 
} 

Tôi muốn để có thể tạo ra các công đoàn của bộ gạch (gạch là một cặp x và y nguyên tọa độ):

fun TileSet.union(another: TileSet) : TileSet = 
    // .. 

Trong Java 8, Tôi có thể làm như sau:

@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); 
    } 
} 

Vì vậy, giao diện được thực hiện với lambda trong TileSet#unite(). Hoặc nó có thể được thực hiện với cách tiếp cận lớp ẩn danh cũ:

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); 
     } 
    } 
} 

Làm cách nào để tạo một triển khai ẩn danh của giao diện đơn phương trong Kotlin?

Tôi biết cách thực hiện nếu tôi sử dụng (Int, Int) -> Boolean thay vì TileSet, nhưng tôi muốn loại có tên mô tả hơn là chỉ chữ ký hàm.

Trả lời

34

Có các ví dụ trong documentation đối với các lớp ẩn danh, nhưng không cho các giao diện.

Đây là cách tôi đã tạo một thể hiện của một giao diện:

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

Chú ý rằng, không giống như trong ví dụ từ tài liệu, không có dấu ngoặc đơn sau object : TileSet.

+0

Tôi nhận được 'Đối tượng phải được khai báo trừu tượng hoặc triển khai toán tử trừu tượng công khai thành viên trừu tượng.' tại sao? – Caipivara

+2

@danielgomezrico Điều đó phải là do lớp cơ sở/giao diện của bạn ('TileSet' trong ví dụ của tôi) tuyên bố một phương thức trừu tượng và bạn nên triển khai nó trong triển khai ẩn danh của mình. – gvlasov

Các vấn đề liên quan