2012-07-13 13 views
5

इस उदाहरण के लिए, मान लीजिए कि हम क्लू ™ का एक डंबेड डाउन गेम बना रहे हैं। हमारे पास हवेली में प्रत्येक कमरे के लिए एक कक्षा है, और प्रत्येक कमरे में संदिग्ध और हथियार के लिए उप-वर्ग हैं। लेकिन बाद नेस्टेड वर्गों थे - Room[i] = new Room("Conservatory", 7, 3);: कुछ की तरह:कक्षा और इसकी नेस्टेड कक्षाओं के लिए एक कन्स्ट्रक्टर

public Room(string Name, int Width, int Height) 
{ 
    this.Name = Name; 
    this.Width = Width; 
    this.Height = Height; 
} 

एक कमरे के रूप में सरल हुआ करता था शुरु कर रहा है:

class Room 
{ 
    public string Name; 
    public int Width; 
    public int Height; 
    // and so on... 

    public class Suspect 
    { 
    public string Name; 
    public bool isPurple; 
    } 

    public class Weapon 
    { 
    public string Name; 
    public bool IsMetal; 
    } 
} 

संदिग्ध और हथियार कक्षाएं जोड़ने से पहले, कमरे में निर्माता की तरह कुछ देखा पेश किया, क्या उनके प्रारंभिक वर्ग को मुख्य वर्ग के साथ साझा कन्स्ट्रक्टर के माध्यम से संभाला जा सकता है? कुछ ऐसा:

Room[i] = new Room("Library", 8, 5, "Professor Plum", true, "Candlestick", true); 

मुझे एक समान सेटअप के कोई उदाहरण नहीं मिल रहे हैं। मैं यह कैसे हासिल कर सकता हूं?

+0

क्या आप इस ParentClass.ChildClass childClass = new ParentClass.ChildClass() की तरह कुछ ढूंढ रहे हैं; – HatSoft

+7

एक नेस्टेड क्लास के माता-पिता वर्ग के साथ कोई विशेष संबंध नहीं है। सिवाय इसके कि आप इसे निजी घोषित कर सकते हैं और इस प्रकार इसे पूरी तरह छुपा सकते हैं। और यह बाहरी वर्ग के निजी सदस्यों तक पहुंच सकता है। यही सब कुछ नहीं है, जहां कोई "साझा कन्स्ट्रक्टर" समझ में नहीं आता है। न ही चरित्र वर्ग को कमरे के निजी कार्यान्वयन के विवरण को समझने के लिए यह समझ में आता है। –

+0

आपको कोई उदाहरण नहीं मिला क्योंकि कोई भी इसके लिए कोई उदाहरण नहीं लिख सकता है, संकलक कैसे जानता है कि "प्रोफेसर प्लम" को Suspect.Name प्रॉपर्टी के मूल्य के रूप में उपयोग किया जाना चाहिए? (मुझे लगता है कि यह आपका इरादा है) – Steve

उत्तर

7

आपके कन्स्ट्रक्टर के पास इतने सारे पैरामीटर होने के बजाय, ऐसा कुछ क्यों न करें?

public class Room 
{ 
    public Room(Suspect suspect, Weapon weapon) 
    { 
     SuspectInRoom = suspect; 
     WeaponInRoom = weapon; 
    } 

    public Suspect SuspectInRoom { get; set; } 
    public Weapon WeaponInRoom { get; set; } 
} 

// Example usage: 

Suspect coronelCustard = new Suspect("Coronel Custard"); 
Weapon musket = new Weapon("Musket"); 

Room someRoom = new Room(coronelCustard, musket); 

// Then your room can be used to access all sorts of data. 

Console.WriteLine(someRoom.SuspectInRoom.Nickname); // "The Big Kahuna" 
Console.WriteLine(someRoom.WeaponInRoom.AttackDamage); // "20" 

नेस्ट कक्षाएं एक मुख्य वर्ग के लिए शुरू की कर रहे हैं, उनके प्रारंभ मुख्य वर्ग के साथ एक साझा निर्माता के माध्यम से नियंत्रित किया जा सकता है? अंततः मैं अपने नेस्टेड वर्ग एक सार्वजनिक निर्माता आप ऐसा कर सकते हैं तो एक ही लाइन में सभी तीन वर्गों को प्रारंभ करने की उम्मीद होगी ...

उदाहरण:

Room someRoom = new Room(new Suspect("Colonel Custard"), new Weapon("Musket")); 

लेकिन, यह बातें इस तरह से करने के लिए एक कोड गंध की तरह है। कन्स्ट्रक्टर कॉल में पहले से बनाए गए और तत्काल सदस्यों का उपयोग करना बेहतर है। यह किसी भी तरह से व्यक्तिगत पसंद है।

+0

+1। लेकिन याद रखें कि आपके कोड में, एक कमरे का कोई नाम नहीं हो सकता है, जो ओपी के कन्स्ट्रक्टर के मामले में नहीं था। – ken2k

+0

@ केन 2k: ओह हाँ, उसे अपनी जरूरतों के अनुसार इसे ट्विक करने की आवश्यकता होगी। मैं सिर्फ यह कहना चाहता हूं कि अपनी कक्षाओं को बेहतर तरीके से कैसे व्यवस्थित किया जाए। –

+1

मैंने कभी क्ले का एक संस्करण नहीं खेला है जिसमें एक हथियार का "हमला नुकसान" महत्वपूर्ण था। आखिरकार, खेल की शुरुआत में केवल एक "हमला" मर चुका है। ;) –

5

तुम भी constructores की जरूरत नहीं है ... बस initializers का उपयोग करें:

var room = new Room { Name = "Library", 
         Width = 7, 
         Height = 3, 
         Suspect = new Suspect { Name = "Professor Plum", 
               PlaysCroquet = false }, 
         Weapon = new Weapon { Name = "Candlestick", 
               IsShiny = true } 
         }; 
+0

संदिग्ध और हथियार उनके उदाहरण में फ़ील्ड नहीं हैं, वे घोंसला वाले वर्ग हैं। –

+1

आपने मेरा विचार चुरा लिया! ;) –

+0

रूपक मेरे लिए थोड़ा अलग हो गया - कारण मैं कन्स्ट्रक्टर का उपयोग कर रहा था, खेतों के भविष्य के यादृच्छिकरण के लिए था। प्रोफेसर प्लम लाइब्रेरी में जरूरी नहीं है। – 4444

2

यह करने के लिए एक आसान तरीका संदिग्ध और हथियार कक्षाएं सार्वजनिक कंस्ट्रक्टर्स दे रहा है, तो वे के बाहर instantiated किया जा सकता है कक्ष वर्ग (मुझे लगता है कि यह स्वीकार्य है, क्योंकि कक्षाओं को सार्वजनिक घोषित किया जाता है)।

कक्ष निर्माता तब एक संदिग्ध और हथियार के संदर्भ ले सकता है। यह आपको कुछ पूर्व बिंदु पर संदिग्ध और हथियार वस्तुओं को बनाने के लिए लचीलापन देता है, और उन्हें निर्माण पर एक कमरे में पास करता है - यह कक्ष वर्ग के निर्माता को संदिग्ध और हथियार वर्गों के गुणों के बारे में जानने से रोकता है (और जब आप संशोधन करते हैं उन्हें जोड़ें)।

संक्षिप्तता के लिए, यदि आप अभी भी सभी वस्तुओं एक पंक्ति में है, इसलिए तरह का निर्माण कर सकते हैं:

Room[i] = new Room("Library", 8, 5, new Suspect("Professor Plum", false), new Weapon("Candlestick", true)); 
1

वर्ग खुद से प्रारंभ किए जाने की जरूरत नहीं है, सदस्य हैं।

कन्स्ट्रक्टर में आपके द्वारा किए गए तर्कों और क्लास के सदस्यों के निर्माण के बारे में कोई औपचारिक प्रतिबंध नहीं हैं।यदि फ़ील्ड या गुणों का प्रकार घोंसला वर्ग होता है - यह * से int या string से अलग नहीं है।

*: एकमात्र संभावित अंतर गैर-सार्वजनिक नेस्टेड वर्गों के प्रकार के सदस्यों को किसी अन्य विधि या कन्स्ट्रक्टर में शुरू किया जाना चाहिए, सार्वजनिक पढ़ने/लिखने वाले गुणों के विपरीत, जिन्हें कक्षा के उदाहरण पर सीधे सेट किया जा सकता है।

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