2015-11-05 4 views
21

मैं एक अंतरफलक हैइंटरफ़ेस का अनाम कार्यान्वयन कैसे बनाएं?</p> <pre><code>interface TileSet { fun contains(x: Int, y: Int) : Boolean } </code></pre> <p>मैं टाइल्स के सेट की यूनियनों (टाइल एक्स की एक जोड़ी है और y पूर्णांक निर्देशांक) बनाने के लिए सक्षम होना चाहते हैं:

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

जावा 8 में, मैं इसे इस तरह कर सकता है:

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

तो एक अंतरफलक TileSet#unite() में एक लैम्ब्डा के साथ किया जाता है।

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

मैं Kotlin में एक एकल विधि इंटरफ़ेस का एक गुमनाम कार्यान्वयन कैसे बना सकते हैं: या यह वर्ष गुमनाम वर्ग दृष्टिकोण के साथ लागू किया जा सकता है?

मुझे पता है कि अगर मैं TileSet के बजाय (Int, Int) -> Boolean का उपयोग करता हूं, लेकिन मैं चाहता हूं कि इस प्रकार के फ़ंक्शन हस्ताक्षर की बजाय वर्णनात्मक नाम हो।

उत्तर

34

अनाम कक्षाओं के लिए documentation में उदाहरण हैं, लेकिन इंटरफेस के लिए नहीं।

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

ध्यान दें कि, प्रलेखन से उदाहरण में विपरीत, object : TileSet के बाद कोई कोष्ठकों हैं:

यह कैसे मैं एक इंटरफेस का एक उदाहरण बनाया है।

+0

मुझे 'ऑब्जेक्ट को अमूर्त घोषित किया जाना चाहिए या अमूर्त सदस्य सार्वजनिक अमूर्त ऑपरेटर को लागू करना चाहिए।' क्यों? – Caipivara

+2

@danielgomezrico यह होना चाहिए क्योंकि आपकी बेस क्लास/इंटरफ़ेस (मेरे उदाहरण में टाइलसेट ') एक अमूर्त विधि घोषित करता है, और आपको इसे अपने अनाम कार्यान्वयन में लागू करना चाहिए। – gvlasov

संबंधित मुद्दे