2012-12-01 37 views
7

मान लीजिए कि मेरे पास एक इंटरफ़ेस है और उस इंटरफ़ेस को लागू करने वाले कई वर्ग हैं। मैं उन वर्गों में से प्रत्येक में toString() के डिफ़ॉल्ट कार्यान्वयन को ओवरराइड करना चाहता हूं (यानी, यदि कुछ वर्ग इसे ओवरराइड नहीं करते हैं, तो इसके परिणामस्वरूप संकलन त्रुटि होनी चाहिए)।यह सुनिश्चित करने के लिए कि कक्षा में toString() विधि को फिर से कार्यान्वित किया जाए?

क्या यह हासिल करना संभव है? इंटरफ़ेस बॉडी में @Override एनोटेशन के साथ या बिना public abstract String toString(); घोषित करना कानूनी है, लेकिन इसका कोई प्रभाव नहीं पड़ता है।

उत्तर

2

एक एनोटेशन और एनोटेशन प्रोसेसर लिखें और संकलन के दौरान इसका उपयोग करें।

आपका एनोटेशन तरह दिखेगा:

public @ interface MustOverrideToString { } 

और अपनी एनोटेशन प्रोसेसर कि

  1. MustOverrideToString टिप्पणी के साथ एक वर्ग फैली
  2. toString पर हावी नहीं होता
किसी भी वर्ग के लिए दिखेगा
+0

यह बहुत सारे काम की तरह लगता है, लेकिन शांत! – chessofnerd

14

यूप, तरह का।

protected abstract String internToString(); 

और फिर

@Override 
public String toString() { 
return internToString(); 
} 
अपने आधार वर्ग में

+1

चालाक है, लेकिन लगता है इस काम कर पहले व्युत्पन्न वर्ग के बाद 'लागू करता internToString बंद हो जाएगा()' - यह वंश इसे फिर से लागू करने की आवश्यकता न पड़े। –

+0

@ VictorSorokin ए के साथ) मूल, बी) चाइल्ड क्लास, और सी) ग्रैंचल्ड क्लास, 3 संभावनाएं हैं: सी 'toString()' को लागू नहीं करता है, जो बी के 'toString() 'को कॉल करने देता है, जो कि A' toString है() ', जो बी के' internToString() 'को कॉल करता है। सी 'toString()' ओवरराइड करता है और अपना कार्यान्वयन देता है। सी 'toString()' को ओवरराइड करता है और 'super()। ToString()' कहता है, जो बी को कॉल करता है जो ए को कॉल करता है जो बी के 'internToString()' को कॉल करता है। मुझे विश्वास है कि यह लक्ष्य प्राप्त करता है, जब तक कि मुझे कुछ कॉलिंग ऑर्डर के बारे में गलत न हो .. – Izkata

+0

आपके समाधान के लिए एक अतिरिक्त अमूर्त वर्ग बनाने की आवश्यकता है, और इंटरफ़ेस को लागू करने वाले प्रत्येक वर्ग को उस सारणी वर्ग का विस्तार करना है, क्या यह सही है? – k29

1

मुझे लगता है कि आपको विशिष्ट श्रेणी में toString() विधि के कार्यान्वयन के अलावा कुछ भी घोषित करने की आवश्यकता नहीं है।

+0

सवाल यह है कि, कक्षा वर्ग ऐसा करने के लिए नई कक्षा को मजबूर करने के लिए क्या कर सकता है? – Izkata

0

यदि आप abstract सीएल बनाते हैं गधा आप एक और एक विधि की जरूरत नहीं है:

public abstract class Base{ 
    public abstract String toString(); 
} 

... 

public class Sub extends Base{} //will not compile