प्रत्येक लूप के संबंध में वंशानुक्रम कैसे काम करता है? कल्पना कीजिए कि मेरे पास दो वर्ग हैं: 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
मैं एक अलग सूची का प्रबंधन करने की सलाह देता हूं जिसमें केवल सबक्लास के उदाहरण शामिल हैं, यदि संभव हो तो।