2017-01-25 5 views
6

, इस लिंक पर बहुत जानकारीपूर्ण हैस्कैला अमूर्त वर्ग, स्वयं क्या करता है? मैं सार कक्षाओं के बारे में सीख रहा हूँ

scala generic method overriding

abstract class Foo[T] { self:T => 
    def bar1(f:T):Boolean 
    def bar2(f:T):T 
} 

class FooImpl extends Foo[FooImpl]{ 
    override def bar1(f:FooImpl) = true 
    override def bar2(f:FooImpl) = f 
} 

क्या स्वयं करता है: टी खड़ा के लिए टी वर्ग पैरामीटर के रूप में मैं समझता हूँ है?।

+4

यह एक स्व प्रकार है जो लागू करता है कि 'फू' का कोई उप प्रकार स्वयं 'फू' को दिया गया प्रकार पैरामीटर होना चाहिए – cchantep

उत्तर

3

उसकी टिप्पणी में आपका उल्लेख @cchantep के रूप में, इस मामले में self : T एक स्वयं प्रकार एनोटेशन मूल रूप से कह रही है कि Foo[T] जरूरतों का एक उदाहरण यह भी एक T के रूप में व्यवहार करने के लिए है। आप देख सकते हैं कि FooImpl में FooImpl <: Foo के रूप में वास्तव में यह मामला है।

आप स्वयं प्रकार एनोटेशन here, here या here के बारे में अधिक जानकारी प्राप्त कर सकते हैं। ध्यान दें कि, अधिकांश बार, आप इसे निर्भरता इंजेक्शन और केक पैटर्न के संदर्भ में उपयोग करेंगे।

दूसरे शब्दों में, क्या ऐसा करने का बिंदु है:

the second link से अधिकांश दिलचस्प मैं प्रारंभिक खंड लगता है

trait A
trait B { this: A => }

जब तुम सिर्फ बजाय सकता है ऐसा करें:

trait A
trait B extends A

आपको [इस वाक्यविन्यास] का उपयोग क्यों करना चाहिए?

[...] उत्तर आम तौर पर "बी की आवश्यकता ए" (एनोटेशन) बनाम "बी बी ए ए" (विरासत) के रूप में आता है और यह कि निर्भरता प्रबंधन के लिए पूर्व बेहतर है।

अंत में, और केवल स्पष्टीकरण के लिए, ध्यान दें कि self शब्द बिल्कुल आवश्यक नहीं है। यह कोई मान्य चर नाम हो सकता है, लेकिन self या this एक सम्मेलन के रूप में अधिकतर समय हो सकता है। यही है, आप कर सकते हैं:

trait A 
trait B { myVar: A => } 

लेकिन यह कम आम होगा।

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