2013-10-12 2 views
7

चलें कहते हैं कि मैं इन दो वर्गों है, एक अन्यडेवलपर को चेतावनी `कॉल करने के लिए super.foo()` जावा में

public class Bar{ 

    public void foo(){ 

    } 

} 

public class FooBar extends Bar { 

    @Override 
    public void foo(){ 
     super.foo(); //<-- Line in question 
    } 

} 

विस्तार मुझे क्या करना चाहते हैं उपयोगकर्ता चेतावनी देने के कॉल करने के लिए है सुपर वर्ग के विधि foo यदि वे ओवरराइड विधि में नहीं हैं, तो क्या यह संभव है?

या प्रतिबिंब का उपयोग करके जानने का कोई तरीका है कि एक विधि जो सुपर-क्लास की विधि को ओवरराइड करती है, यदि मैं क्लास प्रकार को सुपर पर पास करता हूं तो मूल विधि को कॉल करता है?

उदाहरण के लिए

:

public abstract class Bar{ 

    public Bar(Class<? extends Bar> cls){ 
     Object instance = getInstance(); 
     if (!instance.getClass().equals(cls)) { 
      throw new EntityException("The instance given does not match the class given."); 
    } 
     //Find the method here if it has been overriden then throw an exception 
     //If the super method isn't being called in that method 
    } 

    public abstract Object getInstance(); 

    public void foo(){ 

    } 

} 

public class FooBar extends Bar { 

    public FooBar(){ 
     super(FooBar.class); 
    } 

    @Override 
    public Object getInstance(){ 
     return this; 
    } 

    @Override 
    public void foo(){ 
     super.foo(); 
    } 

} 

हो सकता है कि किसी टिप्पणी मैं सुपर विधि पर डाल सकते हैं तो यह पता चलता है कि यह कॉल किया जाना चाहिए?


संपादित

ध्यान दें, इसके नहीं सुपर वर्ग foo विधि कॉल करने की जरूरत है कि, यह किसी को उप वर्ग के foo विधि बुला, उदाहरण के लिए एक डेटाबेस close तरीका होगा

अगर यह नीचे आ गया तो मैं विधि को "अन-ओवरराइड करने योग्य" बनाने से भी खुश रहूंगा, लेकिन फिर भी इसे एक कस्टम संदेश देना चाहूंगा।

enter image description here

लेकिन यह अभी भी ऊपर है, या यहां तक ​​कि उन्हें एक देने के लिए अच्छा होगा:


संपादित 2

यह यहाँ क्या मुझे इस तरह से करना चाहता था है कुछ और करने के लिए कस्टम संदेश, Cannot override the final method from Bar, please call it from your implementation of the method instead

+1

कर टाल नहीं सकते

public class Bar{ public final void foo(){ //do mandatory stuff customizeFoo(); } public void customizeFoo(){ } } public class FooBar extends Bar { @Override public void customizeFoo(){ //do custom suff } } 

foo विधि सुपर क्लास में 'अंतिम' बनाया की तरह कुछ है विश्लेषण उपकरण/नियम परीक्षक (जैसे आईडीईए)। यह रनटाइम पर नहीं किया जाना चाहिए (उदाहरण के लिए प्रतिबिंब के साथ)। – user2864740

+1

यदि आप टेम्पलेट पैटर्न का उपयोग नहीं कर सकते हैं, तो FindBugs में एक एनोटेशन है जो अनुपलब्ध ओवरराइड का पता लगाता है: [ओवरराइड मस्तइनवोक] (http://findbugs.sourceforge.net/manual/annotations.html) –

+0

* मैं भी इसे बनाने से खुश हूं विधि "अन-ओवरराइड करने योग्य" *: यही 'अंतिम' के लिए है। –

उत्तर

4

संपादित करें: संपादित, उत्तर का जवाब देने के लिए , जिसमें शामिल है:

मैं भी विधि बनाने के साथ खुशी होगी "गैर-ओवरराइड"

... बस विधि final बनाते हैं। इससे सबक्लास को ओवरराइड करने से रोका जा सकेगा। section 8.4.3.3 of the JLS से:

एक विधि अधिभावी या यह छुपा से उपवर्गों को रोकने के लिए final घोषित किया जा सकता।

यह final विधि को ओवरराइड या छुपाने का प्रयास करने के लिए एक संकलित-समय त्रुटि है।

मूल सवाल का जवाब करने के लिए, का उपयोग कर template method pattern बजाय विचार करें:

public abstract class Bar { 
    public foo() { 
     // Do unconditional things... 
     ... 
     // Now subclass-specific things 
     fooImpl(); 
    } 

    protected void fooImpl(); 
} 

public class FooBar extends Bar { 
    @Override protected void fooImpl() { 
     // ... 
    } 
} 

कि fooImpl ओवरराइड और निश्चित रूप से super.fooImpl() कॉल करने के लिए FooBar की उपवर्गों के लिए मजबूर नहीं करता है - लेकिन FooBar से ऐसा कर सकता है उसी पैटर्न को फिर से लागू करना - अपना fooImpl कार्यान्वयन अंतिम बनाना, और एक नई संरक्षित सार विधि पेश करना।

+0

संपादन की जांच करें, मुझे लगता है कि अंतिम का उपयोग कर – FabianCook

+0

@SmartLemon: ठीक है, अगर आप पूरी तरह से आवश्यकताओं को बदलते हैं, तो 'अंतिम' वास्तव में ऐसा करेगा ... –

+0

क्षमा करें, दूसरा संपादन देखें, मूल अभी भी हिस्सा है सवाल का – FabianCook

0

क्या तुम कर सकते हो निम्नलिखित ताकि उपवर्गों को ओवरराइड और यह एक स्थैतिक कोड के साथ संभव हो सकता है अनिवार्य सामान

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