होगा हो सकता है कि आप एक मैप [मैनिफेस्ट, कोई भी] लपेट सकें ताकि यह सुनिश्चित किया जा सके कि मान मैनिफेस्ट कुंजी से मेल खाते हैं।
कि के संभावित स्केच। सबसे पहले एक छोटे से सहायक
class Typed[A](value: A)(implicit val key: Manifest[A]) {
def toPair: (Manifest[_], Any) = (key, value)
}
object Typed {
implicit def toTyped[A: Manifest](a: A) = new Typed(a)
implicit def toTypable[A](a: A) = new {
def typedAs[T >: A : Manifest] = new Typed[T](a)(manifest[T])
}
}
तो आवरण ही (जो एक नक्शा नहीं है)
class TypedMap private(val inner: Map[Manifest[_], Any]) {
def +[A](t: Typed[A]) = new TypedMap(inner + t.toPair)
def +[A : Manifest](a: A) = new TypedMap(inner + (manifest[A] -> a))
def -[A : Manifest]() = new TypedMap(inner - manifest[A])
def apply[A : Manifest]: A = inner(manifest[A]).asInstanceOf[A]
def get[A : Manifest]: Option[A] = inner.get(manifest[A]).map(_.asInstanceOf[A])
override def toString = inner.toString
override def equals(other: Any) = other match {
case that: TypedMap => this.inner == that.inner
case _ => false
}
override def hashCode = inner.hashCode
}
object TypedMap {
val empty = new TypedMap(Map())
def apply(items: Typed[_]*) = new TypedMap(Map(items.map(_.toPair) : _*))
}
इसी के साथ
आप
import Typed._
val repository = TypedMap("foo", 12, "bar".typedAs[Any])
भंडार कर सकते हैं: TypedMap = मानचित्र (जावा .lang.String -> foo इंट -> 12, किसी भी -> बार)
आप
repository[String] // returns "foo"
repository.get[Any] // returns Some("bar")
साथ तत्वों को पुनः प्राप्त मुझे लगता है कि निजी निर्माता सुनिश्चित करना चाहिए कि _ asInstanceOf
सुरक्षित है। inner
, सार्वजनिक छोड़ा जा सकता है के रूप में यह अपरिवर्तनीय है। इस तरह, Map
की समृद्ध इंटरफेस उपलब्ध हो जाएगा, लेकिन दुर्भाग्य से, एक और TypedMap
बनाने के लिए नहीं।
स्रोत
2011-09-07 16:52:02
क्या आपका मतलब है कि आप 'दुश्मन डिस्प्लेस्टोर' को एक चीज़ वापस करने के लिए चाहते हैं यदि 'myEnemy'' वर्टिकलमोवर 'बढ़ाता है, और दूसरी बात यह है कि यह' रैंडममोवर 'बढ़ाती है? क्या होगा यदि यह दोनों को बढ़ाता है? –
हां, यही मेरा मतलब था। लेकिन मैं अपने पूरे विचार की स्वच्छता के लिए आश्चर्यचकित होना शुरू कर रहा हूं। हो सकता है कि मेरे पास लक्षणों में एम्बेडेड कुछ महत्वपूर्ण स्ट्रिंग हो और उस कुंजी के रूप में उपयोग करें। तो विशेषता रैखिकरण के साथ आखिरी ओवरराइडिंग विशेषता एनीमीकंटनर को दूसरे शब्दों में स्थापित करेगी जो बनावट दुश्मन को प्रदर्शित करने के लिए उपयोग की जाती है। – vertti
अधिकांश समय, एक विशेषता/इंटरफ़ेस का बिंदु "मैं जानता हूं कि * एक्स * कैसे करना है", एक्स के विभिन्न कार्यान्वयन की अनुमति देते हुए, अन्य विवरणों की अनुपस्थिति में, मैंने सोचा होगा कि सबसे प्राकृतिक डिजाइन होगा 'मूविंग' विशेषता के पास कुछ प्रकार की 'getMovingStrategy' या' move' विधि सीधे है, जिसे आप लंबवत और यादृच्छिक प्रेरक उपखंडों में तदनुसार कार्यान्वित कर सकते हैं। –