2014-10-27 4 views
6

एक अमूर्त वर्ग instantiated के बाद से नहीं किया जा सकता है, और संरक्षित सदस्यों हमेशा उपवर्गों दिखाई दे रहे हैं के बाद से, यह प्रतीत होता है कि यह कोई फर्क नहीं है कि क्या उसके कंस्ट्रक्टर्स सार्वजनिक या संरक्षित हैं बनाता है।क्या एक अमूर्त वर्ग में संरक्षित व्यक्ति के बजाय सार्वजनिक निर्माता है?

क्या कोई ऐसा उदाहरण है जहां एक सार्वजनिक निर्माता संरक्षित व्यक्ति की तुलना में अंतर कर सकता है? मैं आमतौर पर सबसे प्रतिबंधित पहुंच स्तर पसंद करता हूं जो लागू होता है।

+1

उत्तर कक्षा की आवश्यकताओं पर निर्भर करता है। आपके पास कक्षा के एक से अधिक 'सार' कार्यान्वयन हो सकते हैं जो बुनियादी विन्यास प्रदान करता है, लेकिन ठोस वर्ग द्वारा लागू किए जाने वाले एक या अधिक तरीकों की आवश्यकता होती है। यह आपके मूल सार वर्ग को लागू करने की आवश्यकता हो सकती पुनरावृत्ति की मात्रा को कम करने के लिए किया जा सकता है, उदाहरण के लिए ... – MadProgrammer

+1

संबंधित (सी # के लिए): http://stackoverflow.com/questions/4532233/protected-vs-public -कॉन्स्ट्रक्टर-फॉर-अमूर्त-क्लास-ए-फर्क – clcto

+1

संबंधित: [क्या एक अमूर्त वर्ग के सार्वजनिक निर्माता के लिए अच्छे कारण हैं] (http://stackoverflow.com/questions/4794305/are-here- एक सार्वजनिक-कन्स्ट्रक्टर-ऑफ-ए-अल्ट-क्लास के लिए अच्छे कारण) – Pshemo

उत्तर

8

नहीं, एक अमूर्त वर्ग के लिए सार्वजनिक कन्स्ट्रक्टर बनाने का कोई अच्छा कारण नहीं है: आप अपने अमूर्त वर्ग को पहले बिना सबक्लासिंग के तुरंत चालू कर सकते हैं, और भाषा आपके लिए प्रासंगिक कोने के मामलों से संबंधित है।

विशेष रूप से, यदि आप गुमनाम रूप से अपनी अमूर्त कक्षा को उप-वर्गित करना चाहते हैं, जिसका अर्थ है कि आप उप-वर्ग में अपना स्वयं का कन्स्ट्रक्टर प्रदान करने में असमर्थ हैं, तो भाषा आपके सार आधार के संरक्षित निर्माता के हस्ताक्षर के आधार पर आपके लिए एक प्रदान करेगी वर्ग:

abstract class Foo { 
    protected int x; 
    protected Foo(int x) {this.x = x;} 
    public abstract void bar(); 
} 
public static void main (String[] args) { 
    Foo foo = new Foo(123) { // <<== This works because of "compiler magic" 
     public void bar() {System.out.println("hi "+x);} 
    }; 
    foo.bar(); 
} 

उपरोक्त उदाहरण यह एक अमूर्त वर्ग के संरक्षित निर्माता की तरह दिखता है में शुरू हो जाती है, लेकिन ऐसा नहीं है: संकलक अपने गुमनाम वर्ग *, जो क्या हो जाता है के लिए एक दृश्य निर्माता बनाता है जब आप new Foo(123) लिखते हैं तो आह्वान किया जाता है।

Demo.

* वास्तविक दृश्यता डिफ़ॉल्ट है। धन्यवाद, Pshemo, त्रुटि को खोजने और एक अच्छा test example की आपूर्ति के लिए।

0

अमूर्त वर्ग सार्वजनिक के निर्माता बनाने में वास्तव में कोई बात नहीं है। लेकिन आप सुनिश्चित हो सकते हैं कि कोई भी घटना सीधे उत्पन्न नहीं करेगा।

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