2010-09-01 15 views
7

बस जावा का उपयोग शुरू करना। मुझे .NET के साथ बहुत सारी समानताएं मिलती हैं, लेकिन मुझे लगता है कि जावा में सभी विधियां डिफ़ॉल्ट रूप से आभासी हैं। तो प्रश्न यह है कि मैं उन्हें गैर वर्चुअल बनाने के लिए क्या कर सकता हूं? final कीवर्ड एक और सही समाधान है?जावा में गैर वर्चुअल विधियां

+0

http://download.oracle.com/javase/tutorial/java/IandI/final.html –

+5

मुझे लगता है कि, मुझे 'सी # .NET' में 'जावा' के साथ बहुत सारी समानताएं मिलीं ... जैसा कि ia है मेरे पिता के साथ कुछ समानताएं ... –

+5

@ गारिस आपका अंक नहीं प्राप्त कर सकता ... यह सवाल से कैसे जुड़ा हुआ है? – NixDev

उत्तर

8

हाँ, या निजी

+5

लेकिन 'निजी' - जैसे ही .net - विधि को अन्य वर्गों के कॉल के लिए अनुपलब्ध बनाता है, साथ ही साथ ओवरराइडिंग को रोकता है। –

+2

लेकिन जब मैं अभिभावक वर्ग में उसी नाम के साथ बाल वर्ग में कोई विधि रखने की आवश्यकता हो तो मैं क्या कर सकता हूं। सी # में ऐसे मामलों के लिए एक कीवर्ड नया है ... जावा में कुछ ऐसा ही है। – NixDev

+1

नहीं, कुछ भी नहीं –

2
इसके बजाय अंतिम के रूप में सभी तरीकों को परिभाषित करने के

, आप भी अंतिम रूप पूरे वर्ग को परिभाषित कर सकते हैं। मैं यह नहीं कह रहा हूं कि यह अच्छी या बुरी शैली है या नहीं।

6

यदि आप प्रदर्शन के लिए विधि को गैर-वर्चुअल बनाने का लक्ष्य रखते हैं, तो JIT को तब तक सौदा करने दें जब तक आपके पास सबूत न हो कि यह नहीं कर रहा है।

यदि विधि गैर-आभासी बनाने के कारण को उप-वर्ग में परिभाषित करने में सक्षम होना है, लेकिन बहुरूपता शामिल नहीं है, तो संभवतः आप किसी वास्तविक कारण के लिए उप-वर्गीकरण कर रहे हैं (यदि आप इसे चुनना चाहते हैं तो अधिक कोड पोस्ट करें)।

यदि यह डिज़ाइन के लिए है, तो मैं संभवतः व्यक्तिगत तरीकों के बजाय कक्षा को अंतिम बनाने का सुझाव दूंगा। आईडीईए के पास क्लास डिज़ाइन के लिए अच्छे निरीक्षण हैं। उन लोगों के प्रति बहुत बारीकी से न सुनने की कोशिश करें जो चाहते हैं कि आप सब कुछ खुला छोड़ दें ताकि वे बग या सीमाओं के आसपास हैक करने के लिए उपclass कर सकें; जब आप गलती से अपने उप-वर्ग को तोड़ते हैं तो वे आपके ऊपर और भी जोर से चिल्लाएंगे।

ग्राहकों को अपने स्वयं के प्रकार को जोड़ने के बजाय अपने स्वयं के प्रकार जोड़ने का एक तरीका प्रदान करें और शायद यह भी ध्यान नहीं देगा कि आपकी कक्षाएं अंतिम हैं।

1

इसे स्थिर बनाएं।

यदि आप एक गैर-वर्चुअल विधि कहते हैं तो आप अपने कोड से जानना चाहते हैं कि आप किस क्लास विधि को कॉल कर रहे हैं। .NET की दोष यह है कि आप अपने कोड से नहीं जान सकते हैं।

उदाहरण

जावा में यदि आप के रूप में

public class ClassB extends ClassA { 
    @Override 
    public void run() { 
    } 
} 

ClassB को परिभाषित करने और वस्तु

ClassA obj=new ClassB(); 

यदि आप obj.run फोन() आप अगर उस कोड है कैसे पता चल जाएगा पॉलिमॉर्फिक ओपन/क्लोज़ सिद्धांत के नियमों का पालन करते हुए या क्लास से संबंधित कोड विधि होगी? जावा में आपको पता चलेगा कि हमेशा polymorphism है। मोक्स बनाना आसान है और कक्षाओं का विस्तार करना और लिस्कोव प्रतिस्थापन सिद्धांत का पालन करना आसान है।

दूसरी ओर स्थिर तरीकों पर एक वर्ग को घिरा रहे हैं इसलिए यदि आप एक विधि है कि ClassA से संबंधित है कॉल करना चाहते हैं तो आप इस तरह है कि विधि को परिभाषित कर सकते हैं:

public static run(ClassA obj) 

और आप

साथ यह कॉल कर सकते हैं
ClassB obj=new ClassB(); 
ClassA.run(obj); 

और कोड से आपको पता चलेगा कि जिस विधि को आप बुला रहे हैं उसे क्लास में परिभाषित किया गया है, न कि क्लासबी में।

+2

नहीं। ऑब्जेक्ट से संबंधित होने पर विधि को स्थिर न करें। यह वास्तव में खराब डिजाइन है। – Cephalopod

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