2012-12-15 10 views
6

मुझे यह समझने में थोड़ा कठिनाई हो रही है कि कंटेनर/घटक मॉडल सी # में एक-दूसरे के साथ कैसे बातचीत करता है। मैं समझता हूं कि घटक में एक साइट ऑब्जेक्ट होता है जिसमें कंटेनर और घटक के बारे में जानकारी होती है। लेकिन, लगता है मैं निम्नलिखित कोड था:सिस्टम के साथ काम करना। कॉम्पोनेंट मॉडल

using System; 
using System.ComponentModel; 

public class Entity : Container { 
    public string Foo = "Bar"; 
} 

public class Position : Component { 
    public int X, Y, Z;  
    public Position(int X, int Y, int Z){ 
     this.X = X; 
     this.Y = Y; 
     this.Z = Z; 
    } 
} 

public class Program { 

    public static void Main(string[] args) { 

     Entity e = new Entity(); 
     Position p = new Position(10, 20, 30); 

     e.Add(p, "Position");    

    }  

} 

यह समस्या के बिना काम करता है, यह एक कंटेनर (इकाई) और एक घटक (स्थिति) है कि यह अंदर निहित है परिभाषित करता है।

हालांकि, अगर मैं p.Site.Container का आह्वान करता हूं, तो यह इकाई वापस कर देगा, लेकिन आईसीओन्टैनर के रूप में। यही है, अगर मैं फू का उपयोग करना चाहता हूं तो मुझे (Console.WriteLine(p.Site.Container as Entity).Foo); जैसे कुछ स्पष्ट रूप से करना होगा। यह काफी बोझिल लगता है।

क्या मुझे कुछ याद आ रहा है, या क्या मैं चाहता हूं कि ऐसा करने का एक बेहतर तरीका है?

उत्तर

2

आप कुछ भी याद नहीं कर रहे हैं। एक घटक क्या अंदर हो सकता है इसके बारे में कोई इंटरफ़ेस अनुबंध नहीं है। एक तो बुनियादी तौर पर

public class Entity : Container { 
    public string Foo = "Bar"; 

    public virtual void Add(IComponent component) { 
     if (!typeof(Position).IsAssignableFrom(component.GetType())) { 
      throw new ArgumentException(...); 
     } 
     base.Add(component); 
    } 
} 
+0

, बजाय स्वीकार किसी भी IComponent, की आवश्यकता होती है: यदि आप विधि जोड़ें ओवरलोड आप सीमित करने के लिए क्या घटकों की तरह कंटेनर में जोड़ा जा सकता चाहते हैं कर सकते हैं और घटक के प्रकार की एक जांच जोड़ा जा रहा है इसका अधिक विशिष्ट संस्करण जिसमें मैं क्या देख रहा हूं? अब टाइप के लिए आपके उदाहरण की जांच के बीच एक बड़ा अंतर है, जैसा कि कहने के विपरीत, एक प्रकार की बाधा वाले सामान्य प्रकार की आवश्यकता होती है? मुझे लगता है कि वहाँ है, लेकिन इस समय मुझ पर subtlety खो गया है। –

+1

इस परिदृश्य में जेनेरिक लागू करना अच्छा हो सकता है लेकिन दुर्भाग्यवश जेनरिक .NET 2.0 में पेश किए गए थे लेकिन घटक मॉडेल .NET 1.0 से है इसलिए जेनेरिक उपलब्ध नहीं थे। – Eilon

+0

@ एइलॉन, क्यों न केवल 'is' ऑपरेटर का उपयोग करें। यह 'IsAssignableFrom' से अधिक क्लीनर होगा। – Jordan

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