2010-08-22 13 views
15

मुझे लगता है कि मैं एक सी # वर्ग या दो को छोड़ दिया, लेकिन यहाँ मेरी दुविधा है:सी # सार वर्ग स्थिर क्षेत्र विरासत

मैं एक अमूर्त वर्ग है जहाँ से मैं कई बच्चे कक्षाओं प्राप्त की है।

मुझे यकीन है कि प्रत्येक बच्चे कक्षाओं के लिए मेरे पास एक निर्माता होगा जिसके लिए एक मॉडल के रूप में एक निश्चित स्थैतिक वस्तु की आवश्यकता होती है और यह वस्तु प्रत्येक बच्चे वर्ग के लिए अलग होगी।

मेरा पहला दृष्टिकोण अमूर्त माता-पिता वर्ग में सार्वजनिक स्थैतिक वस्तु बनाना था और फिर, मैंने बच्चों के वर्गों के किसी भी उदाहरण को शुरू करने से पहले, मैं इसे प्रत्येक के लिए संशोधित कर दूंगा, लेकिन यह पता चला है कि इस तरह मैं वास्तव में अमूर्त वर्ग के लिए केवल एक स्थिर वस्तु बनाते हैं, और इसके प्रत्येक बच्चे वर्ग इसका उपयोग करता है।

मैं समस्या को कैसे हल कर सकता हूं?

अधिक सटीक होना करने के लिए, यहाँ स्यूडोकोड है:

माता पिता सार वर्ग:

abstract class AbstractClass 
{ 
    static public ModelObject Model; 
    ... 
} 

बच्चे कक्षाओं में से एक:

class Child : AbstractClass 
{ 
    ... 
    public Child() 
    { 
     this.someField = Model.someField; 
    } 
} 

संपादित करें:

मॉडल को "मॉडलऑब्जेक्ट" वर्ग का सदस्य होना चाहिए, यह सिंगलटन या कोई नहीं होना चाहिए एनजी और

EDIT2:

और भी अधिक सटीक होना करने के लिए, मैं शतरंज का खेल के लिए इस कार्यान्वयन चुना है: प्यादे, शूरवीर: मैं शतरंज के मोहरे और बच्चे कक्षाओं खेल की ठोस टुकड़े प्रतिनिधित्व के लिए एक अमूर्त वर्ग है , और cetera।

अमूर्त वर्ग मेशमैट ऑब्जेक्ट से प्राप्त होता है, एक वर्ग जो जेनेरिक 3 डी ऑब्जेक्ट्स को मूल कार्यक्षमता, जैसे घूर्णन, मेष, सामग्री, बनावट आदि के साथ प्रस्तुत करता है और यह शतरंज के खेल के टुकड़ों जैसे गेटपॉइसमोव्स() के लिए अमूर्त तरीकों को परिभाषित करता है।

मॉडल ऑब्जेक्ट जो मैं ऊपर के बारे में बात कर रहा था वह मेशमैट ऑब्जेक्ट का सदस्य है और मेरी राय में, कक्षा के बाहर केवल एक बार परिभाषित किया जाना चाहिए और फिर सभी टुकड़ों के लिए उपयोग किया जाना चाहिए। मेरा मतलब है: उदाहरण के लिए सभी पंजाों में एक ही जाल और बनावट होती है, इसलिए जब भी आप एक पंख बनाना चाहते हैं तो मुझे पैरामीटर के रूप में मॉडल देने का बिंदु नहीं दिखता है।

+2

किस तरह से सार क्लास को मॉडल तक पहुंचने की आवश्यकता है? – dtb

+2

आपको ऐसे स्थिर क्षेत्र का उपयोग करने के बजाय अपने उप-वर्गों के रचनाकारों को मॉडल उदाहरण पारित करने पर विचार करना चाहिए। – Trillian

+0

मैं ट्रिलियन से सहमत हूं। स्थिर मॉडल वास्तव में यहां encapsulation की भावना का उल्लंघन कर रहा है। –

उत्तर

6

मैं @ shf301 के समाधान के लिए कुछ इसी तरह का प्रयोग करते हैं।अपनी आवश्यकताओं पर निर्भर करता है यह उपयोगी सेटअप करने के लिए आधार वर्ग के रूप में कर सकते हैं:

abstract class AbstractClass 
{ 
} 

abstract class AbstractClass<TModel> : AbstractClass 
    where TModel : ModelObject 
{ 
    static public TModel Model; 
    ... 
} 

यह मैं एक आम आधार वर्ग है कि मैं गैर सामान्य कार्यों में साथ काम कर सकते है। यह व्युत्पन्न प्रकारों को सटीक मॉडल प्रकार चुनने की अनुमति देता है और कास्टिंग पर काटा जा सकता है।

+0

यह सही काम करता है! बस "..." "सार क्लास" पर हैं। एक अच्छा और सरल कार्यान्वयन, धन्यवाद। एक और बात: क्या इस कार्यान्वयन के साथ कोई प्रदर्शन जुर्माना है या ऐसा कोई है? मुझे कोई कारण नहीं दिख रहा है कि यह क्यों होना चाहिए, खासकर वीएस की "अनुकूलित कोड" सुविधा के साथ, लेकिन बस सुनिश्चित करना। – cantrem

+0

संपादित करें: मेरे मामले में प्रकार की बाधा सार क्लास होना चाहिए; तो बाल कक्षाओं को shf301 अंक के रूप में घोषित किया जाएगा। ऐसा इसलिए है क्योंकि मुझे केवल सार क्लास के बच्चों के लिए कार्यान्वयन की आवश्यकता है। कुछ की तरह: AbstractClass : AbstractClass जहां टी: AbstractClass और बच्चा: ChildClass: AbstractClass cantrem

15

आप अपने सार वर्ग जेनेरिक बनाकर साझा स्थिर क्षेत्र के आसपास हो सकते हैं। प्रत्येक सामान्य वर्ग को स्थिर क्षेत्रों की अपनी प्रति प्राप्त होगी।

abstract class AbstractClass<T> 
{ 
    static public ModelObject Model; 
    ... 
} 

तब प्रत्येक बाल वर्ग स्थैतिक क्षेत्र का एक अलग उदाहरण उपयोग करेगा।

class Child : AbstractClass<Child> 
{ 
    ... 
    public Child() 
    { 
     this.someField = Model.someField; 
    } 
} 

यह कोई फर्क नहीं पड़ता कि AbstractClass सामान्य पैरामीटर को संदर्भित नहीं करती। आप केवल प्रत्येक बच्चे वर्ग को बेस क्लास का एक अद्वितीय उदाहरण देने के लिए इसका उपयोग कर रहे हैं।

+1

इनपुट के लिए धन्यवाद, यह आधा रास्ते है। दूसरा आधा जस्टिन आर से आता है। अगर मैं सिर्फ आपके समाधान का उपयोग करता, तो मेरे पास केवल सार क्लास ऑब्जेक्ट्स के साथ काम करने का कोई तरीका नहीं होता। उदाहरण के लिए, मुझे अमूर्त शतरंज के टुकड़ों की 2 डी सरणी डालने में कठिनाई होती। वैसे भी, यह जानना बहुत अच्छा है कि सामान्य वर्गों के साथ प्रत्येक बच्चे को स्थैतिक क्षेत्र की एक प्रति प्राप्त होती है। – cantrem

3

कैसे एक कारखाने एक विरासत मॉडल से अपनी कक्षाओं दसगुणा के बारे में:

public static class ModelObjectFactory 
{ 
    public static ModelObject GetModel<T>(T obj) 
    { 
     // return ModelObject according to type of parameter 
    } 
} 

class Child 
{ 
    public Child() 
    { 
     ModelObject mo = ModelObjectFactory(this); 
     this.someField = mo.someField; 
    } 
} 
+0

एक कारखाने अन्य मामलों में बेहतर काम करता। इस विशेष व्यक्ति में मुझे लगता है कि मैं अधिक जटिल होगा (अगर यह एक शब्द है) स्थिति; लेकिन विचार के लिए धन्यवाद! – cantrem

+0

एक ही जिम्मेदारी के साथ वस्तुओं को कभी भी चीजों को जटिल नहीं करता है। ठोस सिद्धांतों की जांच करें। -1 अगर टिप्पणी संभव हो तो टिप्पणी के लिए :) –

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