2012-02-17 13 views
15

क्या कोई कारण है कि कोई ओवरराइड विधि के एक्सेस संशोधक को बदल सकता है? उदाहरण के लिए,जावा में ओवरराइड विधि के एक्सेस संशोधक को बदलें?

abstract class Foo{ 
    void start(){...} 
} 

और फिर, public के लिए पैकेज-निजी उपयोग संशोधक बदलने

final class Bar extends Foo{ 
    @Override 
    public void start(){...} 
} 

मैं बस जिज्ञासा से बाहर इस सवाल पूछ रहा हूँ।

+1

संभव डुप्लिकेट http://stackoverflow.com/questions/6851612/जावा-एक्सेस-मोडिफायर-एंड-ओवरराइडिंग-विधियां) –

उत्तर

17

जावा आपको एक्सेस संशोधक अधिक प्रतिबंधक बनाने की अनुमति नहीं देता है, क्योंकि यह उस नियम का उल्लंघन करेगा जो एक सुपरक्लास उदाहरण के स्थान पर उप-वर्ग उदाहरण का उपयोग किया जाना चाहिए। लेकिन जब पहुंच कम प्रतिबंधित करने की बात आती है ... ठीक है, शायद सुपरक्लस एक अलग व्यक्ति द्वारा लिखा गया था, और उन्होंने उम्मीद नहीं की कि आप अपनी कक्षा का उपयोग करना चाहते हैं।

प्रोग्राम लोग लिखते हैं और प्रोग्रामिंग इतनी विविधता के दौरान उत्पन्न होने वाली स्थितियां, भाषा डिजाइनरों के लिए यह बेहतर है कि प्रोग्रामर शायद अपनी भाषा के साथ क्या करना चाहें "दूसरा अनुमान लगाएं"। यदि कोई अच्छा कारण नहीं है कि प्रोग्रामर को उप-वर्ग (उदाहरण के लिए) में एक्सेस विनिर्देशकों को कम प्रतिबंधित करने में सक्षम होना चाहिए, तो प्रोग्रामर को यह निर्णय छोड़ना बेहतर होगा। वे अपनी व्यक्तिगत स्थिति के विनिर्देशों को जानते हैं, लेकिन भाषा डिजाइनर नहीं करता है। तो मुझे लगता है कि यह जावा के डिजाइनरों द्वारा एक अच्छी कॉल थी।

6

केवल एक ही है, आप ओवरराइड को अधिक कक्षाओं से दिखाना चाहते हैं, क्योंकि कोई संशोधक डिफ़ॉल्ट नहीं है, सार्वजनिक प्रसारित करता है।

+0

हाँ, यही एकमात्र लाभ था जिसे मैं देख सकता था ... मुझे नहीं पता था कि इसके मुकाबले ज्यादा कुछ है या नहीं। – mre

1

संपादित करें: ठीक है, मैंने समस्या को ठीक करने के लिए अपना जवाब बदल दिया है।

यदि ऐसा नहीं किया जा सका, तो ऐसे कुछ मामले होंगे जहां एक कक्षा एक आईफ़ेरेफ़ को लागू करने और कक्षा का विस्तार करने में सक्षम नहीं होगी क्योंकि उनके पास अलग-अलग एक्सेस संशोधक के साथ एक ही विधि है।

public Interface A { 
    public void method(); 
} 

public abstract classs B { 
    protected void method(); 
} 

public class AB extends B implements A { 
    /* 
    * This would't be possible if the access modifier coulnd't be changed 
    * to less restrictive 
    */ 
    public void method(); 
} 
+1

एक इंटरफ़ेस में परिभाषित सभी विधियां पूरी तरह से सार्वजनिक हैं। – GriffeyDog

+1

इंटरफेस के सभी तरीकों को सार्वजनिक होना चाहिए। – Puce

+0

आपके पास सार्वजनिक या संरक्षित इंटरफ़ेस में गैर-जघन विधि घोषणा नहीं हो सकती है (भगवान केवल जानता है कि संरक्षित इंटरफ़ेस का अर्थ क्या है)। http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html अनुभाग 9.1.4 – Dunes

6

कक्षा का विस्तार करना मतलब है कि सबक्लास को कम से कम अन्य कक्षाओं में समान कार्यक्षमता प्रदान करनी चाहिए।

यदि वह इसे विस्तारित करता है, तो यह कोई समस्या नहीं है।

विस्तार या तो नए तरीकों को जोड़ने या पैकेजिंग-पहुंच विधि सार्वजनिक बनाने जैसी अधिक कक्षाओं में मौजूदा विधियों की पेशकश करके हो सकता है।

यह OOP में एक मूलभूत सिद्धांत है: बच्चे के वर्ग> माता पिता वर्ग का एक पूरी तरह से विकसित उदाहरण है, और चाहिए इसलिए वर्तमान में कम से कम एक ही माता पिता के रूप इंटरफ़ेस -:

2

explaination यह है कक्षा। > संरक्षित/सार्वजनिक चीजों को कम दिखाना इस विचार का उल्लंघन करेगा; आप बच्चे वर्ग> माता-पिता वर्ग के उदाहरणों के रूप में अनुपयोगी वर्ग बना सकते हैं।

class Person{ 
public void display(){ 
    //some operation 
} 
} 

class Employee extends Person{ 
private void display(){ 
    //some operation 
} 


Person p=new Employee(); 

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

[जावा पहुँच संशोधक और अधिभावी तरीकों] (की
संबंधित मुद्दे