2011-12-04 18 views
5

उदाहरण के निरंतर उपयोग से परहेज करते हुए मेरे पास तीन वर्ग, एक अमूर्त उपयोगकर्ता और दो विशिष्ट हैं: सामान्य यूज़र जिसमें एक या अधिक पता वस्तुओं का एक ऐरेलिस्ट होता है जो अलग-अलग (घरेलू, अंतर्राष्ट्रीय, कस्टम इत्यादि) हो सकता है और फिर एडमिन क्लास जिसमें एक विधि है जो सच होती है। उनमें दोनों में अधिक विधियां होती हैं जो एक-दूसरे से असंबंधित होती हैं।जावा विरासत और

abstract class User{ 
    public User(String username, String pw){ 
... 

} 

public class NormalUser extends User{ 
... 
    private ArrayList<Address> addresses; 

... 

    public void addAdress(ArrayList<Address> address){ 
     addresses.addAll(address); 
} 

public class Admin extends User{ 

... 
    public boolean getIsAdmin(){ 
     return true; 
    } 
} 

अब एक और कक्षा में अगर मैं उदाहरण के लिए इस तरह 4 उपयोगकर्ता वस्तुओं बनाने:

ArrayList<User> users; 

    users.add(new NormalUser("1", "pw"); 
    users.add(new NormalUser("2", "pw"); 
    users.add(new NormalUser("3", "pw"); 
    users.add(new NormalUser("4", "pw"); 
    users.add(new Admin("5", "pw")); 
    users.add(new NormalUser("6", "pw"); 

और कहते हैं कि मैं NormalUser में addAddress विधि का उपयोग करना चाहते हैं, तो मैं में specfic उपयोगकर्ता खिन्न करने के लिए है NormalUser करने के लिए उपयोगकर्ताओं, इससे पहले कि मैं इस तरह NormalUser में addAddress विधि का उपयोग कर सकते हैं:

 if (user instanceof NormalUser){ 
     NormalUser normal = (NormalUser) user; 
     normal.addAddress(...) 
     } 

कारण है कि मैं दोनों NormalUser और व्यवस्थापक एक उपयोगकर्ता होना चाहते हैं तो मैं उनका संसाधन करूं है लॉग इन करते समय।

मैंने उपयोगकर्ता वर्ग में एडईमेल जोड़ने और फिर NormalUser क्लास में इसे ओवरराइड करने का विचार किया, लेकिन मुझे NormalUser क्लास में प्रत्येक विधि के लिए ऐसा करना होगा, साथ ही व्यवस्थापक इसे प्राप्त करेगा उपयोगकर्ता भी, जब इसे उस कार्यक्षमता की आवश्यकता नहीं होती है।

प्रश्न 1: क्या ऐसा करने का कोई बेहतर तरीका है जैसा कि मैंने उदाहरण का उपयोग करके सुना है एक बुरी चीज है? और जब भी मैं NormalUser क्लास के लिए विशिष्ट विधि का उपयोग करता हूं, तो मुझे हर बार उदाहरण का उपयोग करना होगा।

Quesiton 2: क्या वस्तु का एक ऐरेलिस्ट नियमित उपयोगकर्ता को विशिष्ट पते/(ऑब्जेक्ट्स) से जोड़ने का सबसे अच्छा तरीका है?

अभी कोई डेटाबेस शामिल नहीं है।

इसलिए उदाहरण के लिए उपयोगकर्ता एक 2 पतों एक घरेलू और एक अंतरराष्ट्रीय है, और उपयोगकर्ता ख सिर्फ एक घरेलू पता है, उपयोगकर्ता ग एक घरेलू और एक कस्टम पता आदि

धन्यवाद है।

पीएस। मैंने पिछली पोस्टों को व्यापक रूप से खोजा है लेकिन एक समाधान मिला है। मेरी जावा किताबों दोनों में वे दोनों उदाहरण का उपयोग करने के उदाहरण दिखाते हैं लेकिन इसका कोई बुरा अभ्यास नहीं है।

+0

इस विशिष्ट मामले के रूप में, मुझे डर है कि मैं वास्तव में यह नहीं कह सकता कि कौन सा बेहतर है, लेकिन नहीं, 'exampleof' परिभाषा द्वारा एक बुरी चीज नहीं है। जब पॉलिमॉर्फिज्म अधिक उचित होता है तो आपको इसे अधिक उपयोग नहीं करना चाहिए। –

+0

'exampleof' से संबंधित: आपको अपने डिज़ाइन पर पुनर्विचार करना चाहिए जैसे कि आप मूल' उपयोगकर्ता 'पर' addAddress' को कभी भी कॉल न करें। आपको केवल उस विधि को कॉल करना चाहिए जब आप कोड के ब्लॉक में हैं जो विशेष रूप से 'NormalUser' के लिए डिज़ाइन किया गया है। – toto2

+0

क्या प्रशासन के पास एड्रेस नहीं होने का कोई अच्छा कारण है? – soulcheck

उत्तर

3

आप Visitor pattern का उपयोग कर सकते हैं - थोड़ा बेकार और थोड़ा अपठनीय, लेकिन शायद आपकी समस्या का सबसे अच्छा समाधान।

असल में बेस क्लास में addEmail को धक्का देने के साथ आपका समाधान खराब नहीं है। बस बेस User में खाली कार्यान्वयन प्रदान करें और RegularUser में ओवरराइड करें। यदि आप यह जांचना चाहते हैं कि User आवृत्ति ई-मेल जोड़ने का समर्थन करती है, तो supportsAddEmailfalse को डिफ़ॉल्ट रूप से true पर addEmail ओवरराइड करते समय दूसरी विधि प्रदान करें।

+0

लेकिन व्यवस्थापक को एडएड्रेस का वारिस नहीं होगा (भले ही यह खाली हो)? – Brah

+0

हां, इसका मतलब है कि आप 'Admin.addEmail() 'को कॉल कर सकते हैं जो कुछ भी नहीं (नो-ऑप) करता है। यही कारण है कि मैं 'एडएडमेल' का समर्थन करता हूं, लेकिन यह वास्तव में एक अच्छा विचार नहीं दिखता है। बिट यह वही नहीं है जो आप चाहते हैं? यदि उपयोगकर्ता 'NormalUser' है, तो ई-मेल जोड़ें, अन्यथा कुछ भी नहीं करें। –

+0

मुझे लगता है कि बेस क्लास में 'एडईमेल' जोड़ना एक अच्छा विचार है, और हानिरहित है। अपनी नो-ऑप प्रकृति के बारे में, आप इसके बारे में सोच सकते हैं "किसी ने ईमेल पते के बारे में व्यवस्थापक ऑब्जेक्ट को बताया है, और यदि व्यवस्थापक परवाह नहीं है, तो हो।" जहां यह गुस्सा हो जाता है यदि आपको बेस क्लास में 'getEmail() 'रखना होगा; इस मामले में, कुछ कार्यान्वयनों को अपवाद फेंकना होगा, जो मुझे बदसूरत लगता है। यदि आप ऐसा करते हैं, कम से कम एक विधि है 'supportGetEmail() '। सबसे अच्छा होगा अगर कॉल साइटें पता हों कि उनके पास कौन सा उपयोगकर्ता सबक्लास है, तो आप केवल 'getEmail() 'को NormalUser में जोड़ सकते हैं। – yshavit

0

मुझे लगता है कि क्लास उपयोगकर्ता सूची बनाने का सबसे आसान समाधान है जिसमें NormalUser की एक सूची और व्यवस्थापक की एक सूची होगी। क्लास उपयोगकर्ता सूची का एक उदाहरण मूल सूची को प्रतिस्थापित करेगा।वर्ग UserList जैसे कुछ तरीकों प्रदान कर सकता है:

  • उपयोगकर्ता getUser (i सूचकांक) // दो सूचियों के साथ लागू किया

  • उपयोगकर्ता removeUser (i सूचकांक) // दो सूचियों के साथ लागू किया

  • NormalUser getNormalUser (i सूचकांक) // सामान्य उपयोगकर्ता सूची
  • NormalUser removeNormalUser (सूचकांक i) // सामान्य उपयोगकर्ता सूची
  • व्यवस्थापक getAdmin (सूचकांक i) के साथ लागू के साथ लागू // कार्यान्वित व्यवस्थापक उपयोगकर्ता सूची
  • व्यवस्थापक removeAdmin (सूचकांक i) // व्यवस्थापक उपयोगकर्ता सूची
  • ....

उचित सूचियों से निपटने के लिए सभी कोड UserList वर्ग में समाहित किया जाएगा के साथ लागू किया । उपयोगकर्ताओं के साथ आपको क्या करने की आवश्यकता है, इस पर निर्भर करता है कि आप दोनों सूचियों या केवल एक सूची का उपयोग कर सकते हैं। उपयोगकर्ता सूची के साथ बातचीत करने वाली कक्षाएं यह नहीं जानती हैं कि उपयोगकर्ता सूची के अंदर केवल एक या दो सूचियां हैं या नहीं।

+0

उत्तर फिल के लिए धन्यवाद, यह मेरे लिए एक अच्छा विचार प्रतीत होता है, हालांकि मुझे सूचियों को पकड़ने के लिए एक नई कक्षाएं नहीं बनाना पड़ेगा। मैं जावा में नया हूं लेकिन उदाहरण के लिए मेरे पास एक पशु सुपरक्लास था, फिर एक बिल्ली और कुत्ते सबक्लास। अगर मेरे पास कुत्तों और बिल्लियों वाले जानवरों की सूची थी, और मैं कुत्तों पर छाल() को फोन करना चाहता था, तो मुझे सही करने के लिए कुत्तों की एक सूची बनाना होगा? - मुझे लगता है कि काउंटर मुझे सहज समझता है:/ – Brah

+0

हैलो। यदि मैं आप कहां हूं, तो मैं बिल्लियों के लिए एक सूची (1) और कुत्तों के लिए एक सूची (2) बनाऊंगा। ध्यान दें कि आपके पास 10000 कुत्तों और 10000 बिल्लियों हैं। यदि आप सूचियों को अलग करते हैं, तो यह सभी कुत्तों को खोजने के लिए बहुत तेज़ होगा, फिर यदि आपके पास 20000 जानवरों के साथ मिश्रित एक सूची होगी। जब आपको छाल() जैसी विधि को कॉल करने की आवश्यकता होती है तो आपको 20 000 जानवरों को संसाधित करने के बजाय कुत्तों की सूची को संसाधित करने की आवश्यकता होती है और यह जांचना पड़ता है कि क्या वे छाल या बिल्लियों को कॉल करने से पहले कुत्ते या बिल्लियों हैं। यदि आपके पास कई तत्व हैं तो प्रदर्शन दो सूचियों के साथ बेहतर होना चाहिए। – Phil

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