दिलचस्प पोस्ट
पायथन में "i + i + x" से अलग "i + = x" कब है? ld मौजूदा पुस्तकालय नहीं ढूँढ सकता मैं बिना किसी संख्या के, लगातार, बढ़ती संख्याओं के साथ एक स्तंभ कैसे प्राप्त करूं? एएसपी.एनटी वेब एपीआई में त्रुटियों की वापसी के लिए सर्वश्रेष्ठ अभ्यास क्या मैं जावा / ग्रोविए में अपने विंडोज डेस्कटॉप वॉलपेपर को बदल सकता हूँ? मैं गिट को अपनी पसंद के संपादक का उपयोग करने के लिए कैसे करूं? शून्य से विभाजित बिंदु (या दोहरी परिशुद्धता) के साथ क्यों नहीं विभाजन करता है java.lang.ArithmeticException: / शून्य से जावा में PHP में ज़िप कोड के बीच दूरी की गणना करना संदर्भ से जावा पास इंटरफ़ेस के तरीकों में से एक की घोषणा / कार्यान्वयन एक इंटरफ़ेस को लागू करने के लिए एक अमूर्त वर्ग क्यों हो सकता है? कई पाठ फ़ाइलों को एक में जोड़ना गोलांग में कस्टम पैकेज कैसे उपयोग करें? स्विफ्ट # सिलेक्टर सिंटैक्स के साथ मैं "संकुचित त्रुटि" का संकलन कैसे करूं? एमवीसी को समझना: मॉडल पर "फैट" की अवधारणा क्या है, नियंत्रकों पर "पतली"? एसक्यूएल द्वारा अद्वितीय रिकॉर्ड कैसे चुनने के लिए

जावा – इंटरफ़ेस कार्यान्वयन में विधि नाम टक्कर

अगर मेरे पास दो इंटरफेस हैं, तो दोनों अपने उद्देश्यों में काफी भिन्न हैं, लेकिन एक ही विधि हस्ताक्षर के साथ, मैं एक क्लास कैसे लागू कर सकता हूँ, दोनों एक ही विधि लिखने के लिए मजबूर किए बिना दोनों इंटरफेस के लिए कार्य करता है और विधि में कुछ जटिल तर्क लिख रहा है क्रियान्वयन जो कि किस प्रकार के ऑब्जेक्ट के लिए कॉल करता है और उचित कोड लागू करता है?

सी # में, इसे स्पष्ट इंटरफ़ेस कार्यान्वयन के रूप में कहा जाता है क्या जावा में कोई समान तरीका है?

वेब के समाधान से एकत्रित समाधान "जावा – इंटरफ़ेस कार्यान्वयन में विधि नाम टक्कर"

नहीं, जावा में एक वर्ग में दो अलग-अलग तरीकों में उसी पद्धति को लागू करने का कोई तरीका नहीं है।

इससे कई भ्रमित स्थितियों का कारण हो सकता है, इसलिए जावा ने इसे अस्वीकार कर दिया है

interface ISomething { void doSomething(); } interface ISomething2 { void doSomething(); } class Impl implements ISomething, ISomething2 { void doSomething() {} // There can only be one implementation of this method. } 

आप क्या कर सकते हैं, दो वर्गों में से एक वर्ग को तैयार करते हैं, जो प्रत्येक एक अलग अंतरफलक लागू करते हैं। तब उस वर्ग के दोनों इंटरफेस का व्यवहार होगा

 class CompositeClass { ISomething class1; ISomething2 class2; void doSomething1(){class1.doSomething();} void doSomething2(){class2.doSomething();} } 

जावा में इसका समाधान करने का कोई वास्तविक तरीका नहीं है आप एक वैकल्पिक हल के रूप में आंतरिक कक्षाओं का उपयोग कर सकते हैं:

 interface Alfa { void m(); } interface Beta { void m(); } class AlfaBeta implements Alfa { private int value; public void m() { ++value; } // Alfa.m() public Beta asBeta() { return new Beta(){ public void m() { --value; } // Beta.m() }; } } 

हालांकि AlfaBeta Beta से Beta को AlfaBeta अनुमति नहीं है, डाउनकास्ट्स आम तौर पर बुराई होती हैं, और अगर यह उम्मीद की जा सकती है कि Alfa उदाहरण में अक्सर Beta पहलू होता है, और किसी कारण से (आमतौर पर अनुकूलन एकमात्र वैध कारण है) आप इसे Beta परिवर्तित करने में सक्षम होना चाहते हैं, आप Alfa उप-इंटरफ़ेस को Beta asBeta() में बना सकते हैं।

यदि आप इस समस्या का सामना कर रहे हैं, तो यह सबसे अधिक संभावना है क्योंकि आप वंशानुक्रम का उपयोग कर रहे हैं जहां आपको प्रतिनिधिमंडल का इस्तेमाल करना चाहिए। यदि आपको दो अलग-अलग प्रदान करना है, हालांकि समान डेटा के समान मॉडल के लिए इंटरफेस है, तो आपको किसी अन्य इंटरफ़ेस का उपयोग करके डेटा को आसानी से उपलब्ध कराने के लिए एक दृश्य का उपयोग करना चाहिए।

उत्तरार्द्ध मामले के लिए एक ठोस उदाहरण देने के लिए, मान लें कि आप संग्रह और MyCollection दोनों को लागू करना चाहते हैं (जो कि संग्रह से प्राप्त नहीं होता है और एक असंगत अंतरफलक है)। आप एक "संग्रह प्राप्तकॉल्व्यूविक्यूव्यू ()" और "मायकॉल्यूशन मिलम्यकॉलप्निव्यूव्यू ()" फ़ंक्शन प्रदान कर सकते हैं जो समान अंतर्निहित डेटा का उपयोग करके संग्रह और मायक्लौकिंग का हल्का-वजन कार्यान्वयन प्रदान करते हैं।

पूर्व के मामले के लिए … मान लें कि वास्तव में आप पूर्णांकों की एक सरणी और तार की एक सरणी चाहते हैं दोनों सूची <Integer> और List <String> से इनहेरिटिंग के बजाय, आपको एक प्रकार की सूची <Integer> और प्रकार की सूची <String> का एक सदस्य होना चाहिए, और दोनों सदस्यों से उत्तराधिकार के बजाय, उन सदस्यों को देखें यहां तक ​​कि अगर आपको केवल पूर्णांकों की एक सूची की आवश्यकता होती है, तो इस मामले में विरासत पर संरचना / प्रतिनिधिमंडल का उपयोग करना बेहतर होता है।

"शास्त्रीय" जावा समस्या भी मेरे एंड्रॉइड विकास को प्रभावित करती है …
इसका कारण सरल लगता है:
अधिक चौखटे / लाइब्रेरी जिन्हें आपको उपयोग करना है, अधिक आसानी से चीजें नियंत्रण से बाहर हो सकती हैं …

मेरे मामले में, मेरे पास एंड्रॉइड। एप से विरासत में मिली एक BootStrapperApp वर्ग है। एप्लिकेशन ,
जबकि एक ही कक्षा को एकीकृत करने के लिए एक एमवीवीएम फ्रेमवर्क के प्लेटफार्म इंटरफेस को भी लागू करना चाहिए।
विधि को टक्कर मिलती है एक getString () विधि पर, जो दोनों इंटरफेस द्वारा घोषित किया गया है और विभिन्न संदर्भों में differenet कार्यान्वयन होना चाहिए।
वर्कअराउंड (बदसूरत..आईएमओ) सभी प्लेटफ़ॉर्म विधियों को कार्यान्वित करने के लिए एक आंतरिक वर्ग का उपयोग कर रहा है, सिर्फ एक मामूली विधि हस्ताक्षर संघर्ष की वजह से … कुछ मामलों में, इस तरह की उधार पद्धति का उपयोग बिल्कुल भी नहीं किया जाता (लेकिन प्रभावित प्रमुख डिजाइन शब्दों) ।
मैं सहमत हूं कि सी # -स्टाइल स्पष्ट संदर्भ / नामस्थान संकेत सहायक है।

मेरे दिमाग में आने वाले एकमात्र समाधान जनसंपर्क वस्तुओं का प्रयोग कर रहा है जो आप बहुआयामी अंतरण करना चाहते हैं।

उदाहरण के लिए: मान लें कि आपके पास 2 इंटरफेस लागू होते हैं

 public interface Framework1Interface { void method(Object o); } 

तथा

 public interface Framework2Interface { void method(Object o); } 

आप उन्हें दो Facador ऑब्जेक्ट में लगा सकते हैं:

 public class Facador1 implements Framework1Interface { private final ObjectToUse reference; public static Framework1Interface Create(ObjectToUse ref) { return new Facador1(ref); } private Facador1(ObjectToUse refObject) { this.reference = refObject; } @Override public boolean equals(Object obj) { if (obj instanceof Framework1Interface) { return this == obj; } else if (obj instanceof ObjectToUse) { return reference == obj; } return super.equals(obj); } @Override public void method(Object o) { reference.methodForFrameWork1(o); } } 

तथा

 public class Facador2 implements Framework2Interface { private final ObjectToUse reference; public static Framework2Interface Create(ObjectToUse ref) { return new Facador2(ref); } private Facador2(ObjectToUse refObject) { this.reference = refObject; } @Override public boolean equals(Object obj) { if (obj instanceof Framework2Interface) { return this == obj; } else if (obj instanceof ObjectToUse) { return reference == obj; } return super.equals(obj); } @Override public void method(Object o) { reference.methodForFrameWork2(o); } } 

अंत में, जिस वर्ग को आप चाहते थे, उसे कुछ करना चाहिए

 public class ObjectToUse { private Framework1Interface facFramework1Interface; private Framework2Interface facFramework2Interface; public ObjectToUse() { } public Framework1Interface getAsFramework1Interface() { if (facFramework1Interface == null) { facFramework1Interface = Facador1.Create(this); } return facFramework1Interface; } public Framework2Interface getAsFramework2Interface() { if (facFramework2Interface == null) { facFramework2Interface = Facador2.Create(this); } return facFramework2Interface; } public void methodForFrameWork1(Object o) { } public void methodForFrameWork2(Object o) { } } 

अब आप getAs * विधियों का उपयोग अपने वर्ग को "पर्दाफाश" कर सकते हैं

आप इन कार्यों को बनाने के लिए एडेप्टर पैटर्न का उपयोग कर सकते हैं प्रत्येक इंटरफ़ेस के लिए दो एडाप्टर बनाएं और इसका इस्तेमाल करें। यह समस्या को हल करना चाहिए

सभी अच्छी तरह से और अच्छे जब आप प्रश्न में सभी कोड पर कुल नियंत्रण है और इस अग्रिम को लागू कर सकते हैं अब कल्पना करें कि आपके पास किसी मौजूदा सार्वजनिक कक्षा का उपयोग विधि के साथ कई स्थानों में किया जाता है

 public class MyClass{ private String name; MyClass(String name){ this.name = name; } public String getName(){ return name; } } 

अब आपको इसे शेल्फ वाइज़बैंग प्रोससेसर से गुजरने की जरूरत है जो डब्ल्यूबीपी इंटरफेस को लागू करने के लिए कक्षाओं की आवश्यकता है … जो कि एक गेस्टनेम () विधि भी है, लेकिन आपके कंक्रीट कार्यान्वयन के बजाय, इस इंटरफ़ेस को उम्मीद है कि विधि एक प्रकार का नाम Wizz बैंग प्रसंस्करण के

सी में # यह एक trvial होगा

 public class MyClass : WBPInterface{ private String name; String WBPInterface.getName(){ return "MyWizzBangProcessor"; } MyClass(String name){ this.name = name; } public String getName(){ return name; } } 

जावा में मुश्किल आप वर्तमान में तैनात कोड बेस में हर बिंदु की पहचान करने जा रहे हैं, जहां आपको एक अंतरफलक से दूसरे तक कनवर्ट करना होगा। यकीन है कि WizzBangProcessor कंपनी को getWizzBangProcessName () का उपयोग करना चाहिए था, लेकिन वे डेवलपर्स भी हैं उनके संदर्भ में getName ठीक था। वास्तव में, जावा के बाहर, अधिकांश अन्य ओओ आधारित भाषाओं इस समर्थन करते हैं। जावा एक ही विधि NAME के ​​साथ लागू करने के लिए सभी इंटरफेस को मजबूर करने में दुर्लभ है।

अधिकांश अन्य भाषाओं में एक कंपाइलर है, जो एक अनुदेश लेने के लिए खुशखबरी से अधिक है "यह इस पद्धति में इस पद्धति के इस पद्धति के हस्ताक्षर से मेल खाती है जो कार्यान्वित इंटरफ़ेस में है, यह कार्यान्वयन है"। परिभाषित इंटरफेस के पूरे पूरे बिंदु के बाद परिभाषा को कार्यान्वयन से समझाया जा सकता है। (यहां तक ​​कि मुझे जावा में इंटरफेस में डिफ़ॉल्ट तरीकों के साथ आरंभ नहीं करना पड़ेगा, अकेले डिफ़ॉल्ट ओवरराइड करना चाहिए …. क्योंकि निश्चित रूप से, प्रत्येक कार को सड़क कार के लिए डिज़ाइन किया जाना चाहिए एक फ्लाइंग कार में पटक दिया और सिर्फ काम करें – अरे वे दोनों कारें हैं … मुझे यकीन है कि डिफ़ॉल्ट कार्यक्षमता का कहना है कि आपका बैट एनएव डिफ़ॉल्ट पिच और रोल आदानों से प्रभावित नहीं होगा, क्योंकि कारें ही चलती हैं!