आप key
के लिए संरचनात्मक प्रकार को परिभाषित कर सकते हैं, लेकिन union
के लिए नहीं। एक संरचनात्मक प्रकार अपने आप को परिभाषित अमूर्त प्रकारों का उल्लेख नहीं कर सकता है। तो यह काम करेगा नहीं:
trait Tree[T <: { def union(x: T): T }]
आप एक ऐसी विशेषता है जो Tree
के तत्वों उपलब्ध बनाने चाहिए, हालांकि परिभाषित कर सकते हैं:
trait TreeVal[T] {
type A
def key: A
def union(x: T): T
}
दो तरह इस्तेमाल किया जा सकता। सबसे पहले, कक्षाओं को उस इंटरफ़ेस को कार्यान्वित करना होगा, जो कि कुंजी के रूप में किन वर्गों का उपयोग किया जा सकता है, इस पर गंभीर बाधा डालती है।यह इस तरह होगा:
trait Tree[T <: TreeVal[T]]
यह भी इस तरह, एक अंतर्निहित रूपांतरण के रूप में की पेशकश की जा सकती है:
class IntVal(v: Int) extends TreeVal[Int] {
type A = Int
def key: A = v
def union(x: Int): Int = x + v
}
implicit def IntIsVal(v: Int): IntVal = new IntVal(v)
class Tree[T <% TreeVal[T]] // must be class, so it can receive parameters
यह प्रयोग किया जाता है क्या बाध्य एक दृश्य कहा जाता है। इसे अधिक जानकारी के लिए देखें, लेकिन यह कहने के लिए पर्याप्त है कि आप किसी भी तरह का इलाज करने में सक्षम होंगे जिसमें एक निहित रूपांतरण परिभाषित किया गया है और दायरे में जैसे कि यह TreeVal
था। उदाहरण के लिए:
class Tree[T <% TreeVal[T]](node: T, left: Option[Tree[T]], right: Option[Tree[T]]) {
override def toString = "(%s < %s > %s)" format (left.getOrElse("o"), node.key, right.getOrElse("o"))
}
वैकल्पिक रूप से, आप इसे प्रकार वर्ग पैटर्न के साथ उपयोग कर सकते हैं, कुछ परिवर्तनों के साथ:
trait TreeVal[T] {
type A
def key(v: T): A
def union(x: T, y: T): T
}
class Tree[T : TreeVal] // must be class, so it can receive parameters
प्रकार वर्ग पैटर्न संदर्भ सीमा का उपयोग करता है। अधिक जानकारी के लिए देखो। इस शैली को आम तौर पर आजकल पूर्व शैली पर प्राथमिकता दी जाती है, क्योंकि यह कई तरीकों से अधिक लचीला है। फिर भी, दोनों काम करेंगे।
इस मामले में, एक इसे इस तरह का प्रयोग करेंगे:
implicit object IntVal extends TreeVal[Int] {
type A = Int
def key(v: Int) = v
def union(x: Int, y: Int) = x + y
}
class Tree[T: TreeVal](node: T, left: Option[Tree[T]], right: Option[Tree[T]]) {
val treeVal = implicitly[TreeVal[T]]
import treeVal._
override def toString = "(%s < %s > %s)" format (left.getOrElse("o"), key(node), right.getOrElse("o"))
}
उत्कृष्ट स्पष्टीकरण, बहुत बहुत धन्यवाद! – newf
लेकिन एक और सवाल: मुझे 'अंतर्निहित वस्तु IntVal' में स्पष्ट रूप से 'टाइप ए' निर्दिष्ट क्यों करना चाहिए? क्या इसे 'डीफ कुंजी' परिभाषा से अनुमानित किया जा सकता है? – newf
हो सकता है कि आप विधि 'कुंजी' के पैरामीट्रिज्ड संस्करण का उपयोग कर सकें:' def key [ए]: ए' – incrop