2012-03-31 14 views
7

मेरे गृहकार्य के लिए, हमें "चार कर्मचारी" नियमित "कॉलेज कर्मचारी, तीन संकाय और सात छात्र घोषित करने" के साथ काम सौंपा गया है। उपयोगकर्ता को यह निर्दिष्ट करने के लिए संकेत दें कि किस प्रकार का डेटा दर्ज किया जाएगा (सी, एफ, एस) या छोड़ने का विकल्प (क्यू)। उपयोगकर्ता जारी रहता है, उचित व्यक्ति के लिए डेटा प्रविष्टि स्वीकार करें। यदि उपयोगकर्ता प्रत्येक व्यक्ति प्रकार के लिए निर्दिष्ट संख्या से अधिक दर्ज करता है तो त्रुटि संदेश प्रदर्शित करें। जब उपयोगकर्ता छोड़ता है, प्रदर्शित करता है स्क्रीन पर एक रिपोर्ट उचित शीर्षक के तहत व्यक्तियों के प्रत्येक समूह को सूचीबद्ध करती है। यदि उपयोगकर्ता सत्र के दौरान एक या अधिक प्रकार के व्यक्तियों के लिए डेटा दर्ज नहीं किया है तो उचित शीर्षक के तहत एक उचित संदेश प्रदर्शित करें। "कोर जावा में विरासत

Class   | Extends   | Variables 
-------------------------------------------------------- 
    Person   | None   | firstName, lastName, streetAddress, zipCode, phone 
    CollegeEmployee | Person   | ssn, salary,deptName 
    Faculty   | CollegeEmployee | tenure(boolean) 
    Student   | person   | GPA,major 

विरासत पर Tutorials पढ़ने और विरासत विचार विमर्श का एक समूह trolling के बाद, मैं मैं यह सही कागज पर मिल गया है, लेकिन कुछ इनपुट पसंद करते हैं इससे पहले कि मैं कोड है कि काम नहीं करता है में गहरी कोहनी मिलेगा लगता है। :)

मैं

Person[x] = new Student(); 

(या Faculty या CollegeEmployee) को परिभाषित कर रहा हूँ।

Person वर्ग एक Person के लिए सभी इनपुट फ़ील्ड होते हैं, और उपवर्गों केवल अतिरिक्त डेटा (जैसे Student के मामले में major) है।

क्योंकि StudentPeople प्रदान करता है और अतिरिक्त Student में परिभाषित चर कि उदाहरण के लिए Person की परिभाषा के साथ जोड़ दिया जाता है जब मैं new Student(); बनाने दोनों People और Student कक्षाओं में इनपुट फ़ील्ड मेरे लिए उपलब्ध हो जाएगा।

जब यह सरणी से डेटा खींचने के लिए समय आता है, जावा Person की एक सरणी के रूप में यह देखता है, तो मैं तर्क जोड़ने की जरूरत है

if Person[x] instanceof Student (or `Faculty` or `CollegeEmployee`) 

Person के प्रकार के लिए उचित कार्रवाई अमल करने के लिए। मेरी समझ यह है कि instanceof आउटपुट पक्ष पर Person कक्षा के बारे में जावा को क्या जानता है (इस मामले में) को ओवरराइड करने के लिए अभिनय कर रहा है।

क्या मुझे इसकी कोई गंभीर समझ याद आ रही है?

+7

यदि आपको 'exampleof' का उपयोग करने की आवश्यकता है, तो एक अच्छा मौका है कि आप कुछ गलत कर रहे हैं ... –

+4

या असाइनमेंट बाधाएं थोड़ी दूर हैं। आप सटीक असाइनमेंट निर्देश पोस्ट करना चाहेंगे। –

+1

व्यक्ति विरासत के लिए हमेशा एक खतरनाक उदाहरण है। जब मैं एक छात्र था, मैं एक ही समय में कॉलेज कर्मचारी था। किसी व्यक्ति की स्थिति में 'भूमिकाएं' जैसी कुछ लागू करके ऐसी स्थिति को (एकाधिक-एकाधिक) विरासत से बेहतर बनाया जा सकता है। – nansen

उत्तर

3

केवल विरासत ही नहीं है, लेकिन बहुरूपता - ऑब्जेक्ट की विधि में ऑब्जेक्ट डेटा दर्ज करने और मान्य करने के लिए आवश्यक कोड डालें (कहें: inputMyData() व्यक्तिगत रूप से आधार विधि को ओवरराइड करना, संभवतः सुपरक्लास की विधि को कॉल करना) - इस तरह आप कर सकते हैं उदाहरण और कास्टिंग से बचें।

1

आम तौर पर, instanceof से बचा जाना चाहिए। इस मामले में करने के लिए सरल बात यह है कि तीन एरे बनाने के लिए: CollegeEmployee[], Faculty[], और Student[], उन्हें सभी को Person[] में लंपाने और बाद में उन्हें सॉर्ट करने के बजाय लगता है।

मूल नीचे जवाब:

मैं समझ रहा हूँ आप सही तरीके से करने के लिए कोशिश कर रहे हैं क्या हैं, तो instanceof आवश्यक नहीं है।

आप की तरह

Person bob = new Student(); 
bob.someAction(); 

जहां someAction एक विधि Person के लिए परिभाषित और Student द्वारा ओवरराइड है कुछ लिखते हैं, तो जावा Student संस्करण फोन करेगा, भले ही विधि एक Person चर पर कहा जाता है।गतिशील प्रेषण सुनिश्चित करता है कि विधि कॉल हमेशा वास्तविक ऑब्जेक्ट प्रकार द्वारा लागू विधि के संस्करण को हल करती है, न कि वेरिएबल प्रकार।

ध्यान दें कि यह केवल तभी काम करता है जब someAction को Person द्वारा एक सार या ठोस विधि के रूप में परिभाषित किया गया हो। अगर इसे पहली बार Student द्वारा पेश किया गया है, तो आपको एक स्पष्ट कलाकार करने की आवश्यकता है।

+2

असाइनमेंट विशेष रूप से * एक सरणी *, या एक और केवल एक सरणी बनाने के लिए कहता है। आपको चार सरणी के लिए अपनी सिफारिश वापस लेनी चाहिए क्योंकि यह निर्देशों के खिलाफ जाती है (और बहुरूपता के प्रदर्शन में बाधा डालती है)। –

+0

क्या वह "चार कर्मचारियों की एक सरणी घोषित करता है" नियमित "कॉलेज कर्मचारी, तीन संकाय और सात छात्र" का अर्थ है? आप यह कैसे करेंगे? – Taymon

+1

'व्यक्ति [] लोग = नया व्यक्ति [14];' –

3

सबसे पहले पता एक अलग वस्तु होना चाहिए।

दूसरे, Student, एक (में) Person के प्रत्यक्ष वंशज नहीं किया जा सकता के रूप में छात्र एक नागरिक का दर्जा/नौकरी भूमिका है (यह परिभाषित करने के लिए भी मुश्किल है) और व्यक्ति इंसान के लिए एक synonyme है, जो दूसरी ओर एक specie है। दूसरे शब्दों में आप यह नहीं कह सकते कि छात्र (inheritance) व्यक्ति का विशेष मामला है, लेकिन आप कह सकते हैं कि व्यक्ति में (composition) छात्र की नागरिक स्थिति है।

यदि आप अपनी कक्षाओं के गुणों पर नज़र डालते हैं तो आप यह भी देखेंगे कि वे एक ही चीज़ का प्रतिनिधित्व नहीं करते हैं। प्रत्येक ऑब्जेक्ट को एक चीज़ (single responsibility principle) पर ध्यान देना चाहिए, जबकि Person ऑब्जेक्ट पहले और अंतिम नाम, आयु इत्यादि को परिभाषित करता है (व्यक्ति से संबंधित गुण) और CollegeEmployee वेतन और विभाग (नौकरी से संबंधित गुण) का नाम परिभाषित करता है। पूरी तरह से असंबंधित गुण।

संक्षेप में, एक व्यक्ति वास्तव में जटिल वस्तु है और यह उस व्यक्ति के लिए एक भयानक उदाहरण है जो ओओ-डिजाइन के सिद्धांतों को समझने की कोशिश कर रहा है।

+1

सहमत है कि 'व्यक्ति' एक बुरा उदाहरण है, पता एक अलग वस्तु होना चाहिए, और वस्तु गुणों का कोई मतलब नहीं है। लेकिन जैसा कि मैंने कहा, मैं असाइनमेंट डिज़ाइन नहीं करता हूं, मुझे बस पैरामीटर से परेशान होना पड़ता है। मुझे लगता है कि यही कारण है कि मुझे इस सेमेस्टर में इतने सारे प्रश्न हैं। :) – dwwilson66

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