java - Chaining methods on a subclass object, methods that return this from both classes -


मेरे पास 2 वर्ग हैं:

  सार्वजनिक वर्ग A {निजी अंतिम सूची & lt; स्ट्रिंग & gt; सूची; सार्वजनिक ए () {सूची = नया अर्रेलिस्ट & lt; स्ट्रिंग & gt; (); } सार्वजनिक ए (स्ट्रिंग एस) {list.add (s)); इस वापसी; } सार्वजनिक एक दूसरे () {System.out.println (सूची); इस वापसी; }} पब्लिक क्लास बी विस्तारित करता है {सार्वजनिक बी bfisrt () {System.out.println ("asd"); इस वापसी; }}   

और मुख्य के साथ एक वर्ग, मुख्य कार्य में निम्न कोड

  बी b = नया बी (); बी। फास्ट ("संयुक्त राष्ट्र") .second (); b.bfirst ();   

लेकिन मैं एक ही ऑब्जेक्ट पर दोनों क्लास से चेन विधियों को पसंद करूंगा। क्या यह सही है? जैसे

  बी बी = नया बी (); B.first ("unu") .second () .bfisrt ();    

चलो इसे नीचे तोड़ते हैं। <पूर्व> सार्वजनिक ए (स्ट्रिंग एस) {list.add (s); इस वापसी; }

विधि का वापसी प्रकार है, इसलिए कॉलिंग नया बी ()। पहले ("हाय") एक देता है प्रकार का उद्देश्य । इसलिए जब मैं संकलन करने की कोशिश की, मुझे उम्मीद है कि असंगत प्रकार कहने में त्रुटि हुई।

आप मार्कशैस उत्तर की तरह, विधि को ओवरराइड कर सकते हैं और ऐसा करते हैं लेकिन एक B :

  सार्वजनिक बी पहले (स्ट्रिंग्स) वापस लौट सकते हैं। {सुपर। फास्ट (एस); इस वापसी; }   

या यहां तक ​​कि

  सार्वजनिक बी पहले (स्ट्रिंग्स) {रिटर्न (बी) सुपर। फास्ट (एस); }   

केशेवा की विधि आपको मैन्युअल रूप से डाली जाती है जब वापसी का प्रकार होता है, लेकिन आप जानते हैं कि यह एक B है। <पूर्व> बी बी = नया बी (); ((बी) b.first ( "unu") दूसरा ()।) Bfisrt ()।;

लेकिन, विशेष रूप से लंबे समय तक चेन के साथ जहां आपको कई बार डालने की ज़रूरत होती है, यह अत्यधिक कोड-अव्यवस्था है।

यहां एक और समाधान है जो आपकी आवश्यकताओं के अनुरूप हो सकता है।

  सार्वजनिक सार वर्ग ए {सार्वजनिक & lt; अज्ञात A & gt; अज्ञात पहले (स्ट्रिंग्स) {System.out.println ("यहाँ" में); वापसी (अज्ञात) यह; }} सार्वजनिक वर्ग बी एक {} सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग्स फैली हुई है) {// विधि को मैन्युअल रूप से कास्ट करने के बिना संकलित करता है बी बी = नया बी ()। पहले ("हाय")। पहले ("हैलो"); }   

आप क्यों यह काम कर सकते हैं पढ़ सकते हैं।

संपादित करें: जैसा कि नईकैक्ट ने बताया, यह कर सकते हैं कुछ हद तक सुरक्षित हो, लेकिन केवल यदि आप बिल्डर पैटर्न या का उपयोग नहीं करते हैं, तो आप क्या नहीं देते हैं नीचे दिए गए कोड के दो टुकड़ों पर विचार करें:

  बी बी = नया बी ()। पहले ("हाय")। पहले ("हैलो"); // ऊपर संकलन और काम करता है आप 'बी बी' को एक `नए बी ()` वर्ग सी के लिए निर्दिष्ट करते हैं, सी {} सी सी = नया बी () फैली हुई है। पहले ("हाय"); // ClassCastException, लेकिन आप तुरन्त यह देख सकते हैं 'सी सी' को 'नई बी ()'     को सौंपा गया है

Comments

Popular posts from this blog

ios - Adding an SKSpriteNode to SKScene from a child SKSpriteNode -

Matlab transpose a table vector -

c# - Textbox not clickable but editable -