/ / प्रत्येक लूप के साथ वंशानुक्रम कैसे काम करता है? - जावा, वंशानुक्रम, foreach

प्रत्येक लूप के लिए विरासत कैसे काम करती है? - जावा, विरासत, foreach

प्रत्येक लूप के संबंध में वंशानुक्रम कैसे काम करता है? कल्पना कीजिए कि मेरे पास दो वर्ग हैं: SubClass तथा SuperClass, और मेरे पास निम्नलिखित हैं ArrayList.

/**
* Containes both SuperClass and SubClass instances.
*/
ArrayList<SuperClass> superClasses = new ArrayList<SuperClass>();

क्या इससे अधिक पुनरावृति संभव है superClasses इस तरह से केवल चयन के रूप में subClasses.

निम्नलिखित:

for(SubClass subClass : superClasses){
// Do Foo
}

ऐसा नहीं करता है। निम्नलिखित केवल एक चीज है जो मुझे काम करने के लिए मिल सकती है:

for(SuperClass superClass : superClasses){
if(superClass instanceof SubClass){
// Do Foo
}
}

हालांकि मैं उपयोग नहीं करना चाहता instanceof जब तक पूरी तरह से आवश्यक नहीं है, जैसा कि मैं पढ़ता रहता हूंहर जगह (StackOverflow, Oracle Tutorials आदि) कि एक लगभग हमेशा एक बेहतर समाधान ढूंढ सकता है जो एनकैप्सुलेशन बढ़ाता है। क्या ऐसा करने का अधिक सुरुचिपूर्ण तरीका है?

उत्तर:

जवाब के लिए 5 № 1

वैसे आप छिपाने के लिए एक सहायक विधि लिख सकते हैं instanceof परीक्षा... अमरूद इस तरह एक विधि है, उदाहरण के लिए, में Iterables.filter, जो आप इस तरह उपयोग कर सकते हैं:

for (SubClass subclass : Iterables.filter(superclasses, SubClass.class)) {
...
}

यह केवल बढ़ रहा है instanceof हालांकि वास्तव में जाँच करें - इससे छुटकारा नहीं मिल रहा है जरुरत वह जाँच करें, क्योंकि फ़िल्टरिंग के लिए कुछ मिला है।


जवाब के लिए 2 № 2

पहला दृष्टिकोण (for (SubClass subClass : superClasses)) काम नहीं कर सकता क्योंकि कंपाइलर यह सुनिश्चित नहीं कर सकता है कि टायो के केवल ऑब्जेक्ट हैं SubClass वहाँ पर।

जावा में (बाहरी पुस्तकालयों के बिना) इस पर preselect संभव नहीं है Class। इसलिए instanceof ऐसा करने का सामान्य तरीका है।


उत्तर № 3 के लिए 1

instanceof इस स्थिति में बिल्कुल ठीक काम करेगा। लेकिन अगर आपके पास इसका उपयोग न करने के कारण हैं Boolean skipMe = true, और यदि आप चाहते हैं तो उपवर्ग में झूठ को बदल दें।

लेकिन मैं उपयोग करने का सुझाव देता हूं instanceof


जवाब के लिए 0 № 4

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