2012-02-09 13 views
5

के आधार पर एक अलग प्रकार है, मुझे पता है, मुझे पता है कि सरल उत्तरों का एक टन है जो इस से बचने के लिए अधिकांश मामलों को कवर करता है।जावा में 'if` कथन के अंदर एक चर घोषित करना जो सशर्त

मेरे मामले में, मैं एक गेम में सीपीयू प्लेयर बनाने के लिए उपयोगकर्ता इनपुट जानकारी का उपयोग करना चाहता हूं। यदि उपयोगकर्ता आसान मोड चुनता है, तो मैं EasyPlayer कक्षा के उदाहरण को घोषित करना और तत्काल करना चाहता हूं। अन्यथा, मैं HardPlayer कक्षा के उदाहरण को घोषित करना और तत्काल करना चाहता हूं। किसी भी तरह से, चर के विशिष्ट नाम को "cpu" होना आवश्यक है और शेष कोड "cpu" पर अंधाधुंध रूप से चल रहा है। यही है, इन कार्यों को उनके विभिन्न वर्गों में कैसे बनाया जाता है, इस बारे में सभी मतभेद, जो CpuPlayer वर्ग को उपclass करते हैं।

// Set the opponent. 
if (difficulty == 0){ 
    EasyPlayer cpu = new EasyPlayer(num_rounds); 
} 
else{ 
    HardPlayer cpu = new HardPlayer(num_rounds); 
} 

यह मैं कभी कष्टप्रद cannot find symbol त्रुटि देता है:

तो यहाँ कोड है। जो मैं पढ़ सकता हूं, उससे हर कोई कहता है कि आप इस तरह के एक सशर्त के भीतर दायरे की समस्याओं और संभावनाओं के कारण घोषणा नहीं कर सकते हैं।

यदि हां, तो उपयोगकर्ता इनपुट के आधार पर दो अलग-अलग वर्गों में से एक के रूप में वैकल्पिक रूप से एकल चर घोषित करने का सही तरीका क्या है?

+1

+1 यह समझने के लिए कि आपके पास यहां मौजूद समाधान अपर्याप्त है और सहायता के लिए SO पर आ रहा है। –

उत्तर

10
CpuPlayer cpu; 

if (difficulty == 0){ 
    cpu = new EasyPlayer(num_rounds); 
} 
else{ 
    cpu = new HardPlayer(num_rounds); 
} 
+0

आह। मेजर हेड-स्लैपिंग पल। धन्यवाद। – ely

0

इसे पहले घोषित करें, और उसके बाद इसे असाइन करें।

// Set the opponent. 
CpuPlayer cpu = null; 
if (difficulty == 0){ 
    cpu = new EasyPlayer(num_rounds); 
} 
else{ 
    cpu = new HardPlayer(num_rounds); 
} 
if(cpu == null) throw new IllegalStateException(); 
+0

शुरुआत में शून्य असाइनमेंट अनावश्यक लगता है, क्योंकि आईएफ सशर्त के लिए एक ईएलएसई है। जब तक हार्डप्लेयर को सीपीयूप्लेयर से प्राप्त होता है, और हार्डप्लेयर निर्माण के दौरान कोई अपवाद नहीं फेंकता है, तो ऐसा लगता है कि कार्यक्रम की पहली और आखिरी पंक्ति अनावश्यक है। क्या मैं कुछ भूल रहा हूँ? – eternaln00b

+0

@ सिद्धार्थशंकर यह एक आदत है - अक्सर बार, आप "इस चर को असाइन नहीं किया जा सकता" त्रुटियों के साथ समाप्त हो जाएगा। – corsiKa

+2

शून्य असाइनमेंट और बाद की जांच केवल अनावश्यक नहीं है, वे हानिकारक हैं कि वे एक रनटाइम चेक में एक संकलन-समय की जांच को चालू करते हैं। प्रारंभिक असाइनमेंट के बिना, 'else' खंड के बाद 'cpu' का उपयोग करने का कोई भी प्रयास परिणामस्वरूप संकलित-समय त्रुटि में होगा जब तक कि' cpu' को मान निर्दिष्ट नहीं किया गया था (इस मामले में, दो 'नए' उदाहरणों में से एक) कोड शाखाएं दूसरे शब्दों में, यदि कोई कोड शाखा थी जो मूल्य निर्धारित करने के लिए भूल गई थी, तो संकलक आपको बताएगा (रनटाइम अपवाद फेंकने के बजाए)। – yshavit

0
// Set the opponent. 
CpuPlayer cpu; 
if (difficulty == 0){ 
    cpu = new EasyPlayer(num_rounds); 
} else{ 
    cpu = new HardPlayer(num_rounds); 
} 
1
CpuPlayer cpu; 
// Set the opponent. 
if (difficulty == 0){ 
    cpu = new EasyPlayer(num_rounds); 
} else{ 
    cpu = new HardPlayer(num_rounds); 
} 
2

आपका इरादा केवल CpuPlayer वर्ग के लिए उपलब्ध तरीकों कॉल करने के लिए है, तो शायद उपयोग करने के लिए एक बेहतर डिजाइन पैटर्न Strategy Pattern है। आपके मामले में, आप शायद CpuStrategy नामक एक नया वर्ग जोड़ना होगा, और की तरह कुछ करने के लिए अपने CpuPlayer निर्माता संशोधित:

public CpuPlayer(CpuStrategy strategy, int num_rounds) 

यह आपके कोड के बाकी को पढ़ने के लिए आसान है और शायद आसान भी बनाए रखने के लिए बनाता है। यहाँ कोड के अपने मूल टुकड़ा लगेगा क्या की तरह है:

CpuPlayer cpu = new CpuPlayer(new CpuStrategy(difficulty), num_rounds); 

हम से छुटकारा मिला है, तो/किसी और के बाद से CpuStrategy वर्ग कठिनाई स्तर के बीच अंतर को संभाल लेंगे। यह भी समझ में आता है क्योंकि आप अपने कार्यक्रम के मांस से "कठिनाई के स्तर" की धारणा को दूर कर सकते हैं, जो मुझे लगता है कि गेम खेल रहा है।

+0

टिप और अतिरिक्त विवरण के लिए धन्यवाद। यह वास्तव में एक अच्छा पुनः डिजाइन विचार है। – ely

0

आप अपनी कक्षा संरचना के डिजाइन को ट्विक कर सकते हैं। लेवल नामक एक अभिभावक वर्ग बनाएं और EasyLevel और HardLevel नामक दो बाल वर्गों का विस्तार करें।

class EasyLevel : public Level 
{ 

    //implementation specific to easy level 
} 

class HardLevel : public Level 
{ 
    //implementation specific to hard level 
} 
अपने खिलाड़ी कक्षा में

, एक निर्माता प्रकार स्तर की एक पैरामीटर लेने के लिए संशोधित जोड़ें।

class Player 
{ 
    Level level; 
    int rounds; 

    public: 
    Player (Level level, int num_rounds) 
    { 
     this.level = level; 
     this.rounds = num_rounds; 
    } 

    play() 
    { 
     // use level variable to invoke implementation specific to the set level, hard or easy. 
    } 
} 

यह आपको कक्षा संरचना को और अधिक विस्तार योग्य बना देगा। उदाहरण के तौर पर यदि आपको भविष्य में एक और स्तर 'माध्यम' जोड़ने की आवश्यकता है, तो केवल मूल वर्ग स्तर से विस्तार करने की आवश्यकता है।

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