2012-04-18 14 views
8

के साथ काम नहीं करता है, मैं <: के साथ विशेषता प्रकार में ओवरराइड करना चाहता हूं और = के साथ नहीं (जैसे उत्तर Scala Upper Bounds : value is not a member of type parameter)।अमूर्त प्रकार ओवरराइडिंग के साथ केक पैटर्न ऊपरी प्रकार के बाउंड

मैं केक पैटर्न का उपयोग करना चाहता हूं, लेकिन यह काम नहीं करता है, मुझे समझ में नहीं आता क्यों?

trait A { 
    def ping = println("ping") 
} 

trait Cake { 
    type T 
} 

trait S { this: Cake => 
    type T = A 
    def t: T 
    t.ping 
} 

ठीक है, यह उदाहरण रन, लेकिन मेरी वास्तविक उपयोग के मामले में मैं के साथ = यह टी समारोह का उपयोग करने की, क्यों असंभव लगता है <: और नहीं के साथ प्रकार ओवरराइड करने के लिए करना चाहते हैं?

trait S { this: Cake => 
    type T <: A 
    def t: T 
    t.ping 
} 

वापसी एक त्रुटि value ping is not a member of S.this.T

उत्तर

15

यह स्काला के प्रकार प्रणाली की एक कमी है। मिश्रण में सदस्यों का निर्धारण करते समय, स्कैला दो नियमों का उपयोग करता है: पहला, ठोस हमेशा अमूर्त ओवरराइड करता है। दूसरा, यदि दो सदस्य कंक्रीट, या दोनों सार दोनों हैं, तो जो बाद में रैखिकरण आदेश में आता है वह जीतता है।

इसके अलावा

, एक विशेषता का आत्म प्रकार

trait S { this: C => ... } 

परोक्ष

trait S { this: S with C => ... } 

ताकि विशेषता एस में परिभाषाओं एस से पहुंचा जा सकता आपके मामले में, विशेषता एस के लिए संवर्धित है के रूप में देखा जाता है:

trait S { this: S with Cake => 
    type T = A 
    def t: T 
    t.ping 
} 

अब तक, जब तक टी कंक्रीट है, यह ठीक है क्योंकि यह अब ओवरराइड करता है केक में टी स्ट्रैक्ट करें। लेकिन अगर टी अमूर्त है, तो केक में से एक बाद में रैखिकरण क्रम में जीतता है और जीतता है। और उस टी में ऊपरी बाध्य नहीं है, इसलिए कोई सदस्य पिंग नहीं है। एक तरीका यह तय करने के लिए लिखित रूप से linearization क्रम बदलने के लिए है:

trait S { this: Cake with S => 
    type T <: A 
    def t: T 
    t.ping 
} 

अगर स्काला एक अलग नियम का कहना है कि सार प्रकार के सदस्यों के सभी बाधाओं mixin में विलय कर रहे हैं के लिए किया था यह क्लीनर होगा, बजाय एक उठा के रैखिकरण आदेश के अनुसार एकल सदस्य। यह एक बदलाव है जिसे हम भविष्य में विचार करना चाहते हैं, लेकिन हमें पीछे की संगतता से सावधान रहना होगा।

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