2013-08-20 8 views
11

मैं अपनी मां वर्ग की एक लागू विधि को लागू करने के लिए सबक्लास को मजबूर करना चाहता हूं। मुझे यह Java - Force implementation of an implemented method दिखाई देता है लेकिन मैं अपनी मां वर्ग को एक अमूर्त वर्ग में परिवर्तित नहीं कर सकता।अमूर्त उपयोग किए बिना उपclass में किसी विधि के कार्यान्वयन को कैसे बल देना है?

public class myMotherClass { 

    myMethod { 

     ...some code .. 

    } 

} 

public class myClass extends myMotherClass { 

    myMethod { 

     ... other code ... 
    } 

} 

तो, इस उदाहरण में, मैं myClass को MyMethod को लागू करना चाहता हूं।

मेरी अंग्रेजी के लिए क्षमा करें ...

+1

संक्षेप में: आप इसे अमूर्त बनाने के बिना नहीं कर सकते –

+0

@stonedsquirrel एक इंटरफेस के बारे में क्या? –

+0

एनोटेशन का उपयोग करना या अपवाद फेंकना संभव नहीं है यदि वर्ग विधि को लागू नहीं करता है? – Maniz

उत्तर

16

आप एक विधि ओवरराइड करने के लिए एक उपवर्ग लिए मजबूर नहीं कर सकते हैं। आप केवल इसे अमूर्त बनाकर एक विधि को लागू करने के लिए मजबूर कर सकते हैं।

तो अगर आप myMotherClass सार है कि आप केवल एक और सुपर क्लास कि विधि है कि लागू किया जाना चाहिए करने के लिए myMotherClass और प्रतिनिधियों फैली लागू कर सकते हैं नहीं कर सकते:

public abstract class EnforceImplementation extends myMotherClass { 

     public final void myMethod(){ 
      implementMyMethod(); 
     } 

     public abstract void implementMyMethod(); 
} 

संपादित

मैं एक interessting रास्ता मिल गया hemcrest एपीआई में समस्या को हल करने के लिए उदाहरण है मॉकिटो द्वारा प्रयोग किया जाता है।

public interface Matcher<T> extends SelfDescribing { 

    /** 
    * Evaluates the matcher for argument <var>item</var>. 
    * <p/> 
    * This method matches against Object, instead of the generic type T. This is 
    * because the caller of the Matcher does not know at runtime what the type is 
    * (because of type erasure with Java generics). It is down to the implementations 
    * to check the correct type. 
    * 
    * @param item the object against which the matcher is evaluated. 
    * @return <code>true</code> if <var>item</var> matches, otherwise <code>false</code>. 
    * 
    * @see BaseMatcher 
    */ 
    boolean matches(Object item); 

    /** 
    * This method simply acts a friendly reminder not to implement Matcher directly and 
    * instead extend BaseMatcher. It's easy to ignore JavaDoc, but a bit harder to ignore 
    * compile errors . 
    * 
    * @see Matcher for reasons why. 
    * @see BaseMatcher 
    */ 
    void _dont_implement_Matcher___instead_extend_BaseMatcher_(); 
} 

इंटरफ़ेस _dont_implement_Matcher___instead_extend_BaseMatcher_ विधि निर्दिष्ट करता है। बेशक यह दूसरों को Matcher इंटरफ़ेस को लागू करने से नहीं रोकता है, लेकिन यह डेवलपर को सही दिशा में मार्गदर्शन करता है।

और BaseMatcher वर्ग के रूप में अंतिम

public final void _dont_implement_Matcher___instead_extend_BaseMatcher_() { 
    // See Matcher interface for an explanation of this method. 
} 

अंत में मुझे लगता है कि यह एक डिजाइन समस्या है _dont_implement_Matcher___instead_extend_BaseMatcher_ विधि को लागू करता है, क्योंकि BaseMatcher obviouosly तर्क है कि हर Matcher को लागू करना चाहिए लागू करता है। इस प्रकार Matcher एक अमूर्त वर्ग बनाने और टेम्पलेट विधि का उपयोग करना बेहतर होता।

लेकिन मुझे लगता है कि उन्होंने ऐसा किया क्योंकि यह बाइटकोड संगतता और नई सुविधाओं के बीच सबसे अच्छा समझौता था।

4

आप अपने पदानुक्रम rework सकता है, ताकि अपने ठोस वर्ग केवल पेड़ के पत्ते हैं।

myClass extends myMotherClass 

के बजाय

myClass extends myMotherAbstractClass 
myMotherClass extends myMotherAbstractClass 

इस तरह सार वर्ग दोनों instantiated वर्गों द्वारा विरासत में मिला है पर विचार करें। इस मामले में myMotherClass बहुत पतला होगा, बस myMethod के कार्यान्वयन।

-1

यदि आप वास्तव में विधि उपयोग को लागू करने के लिए मजबूर करना चाहते हैं तो interface का उपयोग करना चाहिए।

public interface MyInterface{ 

    void myMethod(); 
} 

अब अगर कुछ एक MyClass implements MyInterface के रूप में इस इंटरफ़ेस से लागू करना चाहते हैं, आप लागू करने के लिए myMethod();

public MyClass implements MyInterface{ 

    public void myMethod{ 
    // do something 
    } 

} 
+2

मुझे नहीं लगता कि इससे समस्या हल हो जाएगी। – Lokesh

0

एक बात ज्यादातर लोगों को अनदेखा कर रहे निम्नलिखित कार्यान्वयन है (हालांकि मैं एक टिप्पणी में यह का उल्लेख देखा था):

public class MyMotherClass { 

    public void myMethod() { 
     throw new RuntimeException("Method not overwritten"); 
    }  

} 

ज्यादातर मामलों में यह पर्याप्त होना चाहिए, जैसा कि आप स्वीकृति परीक्षण के कुछ फार्म होना चाहिए (भले ही यह केवल हाथ से विरासत वर्ग का परीक्षण कर रहा हो)। सिद्धांत रूप में, आप अभी भी इस संभावना को पेश कर रहे हैं कि कोई भी इस बात का एहसास नहीं करेगा कि उत्पादन के बावजूद विधि को खत्म नहीं किया गया है।

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

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