2012-01-03 9 views
9

मेरे पास एक अमूर्त पैरेंट क्लास है, और मैं इसे बल सभी सबक्लास को स्ट्रिंग() विधि को लागू करने के लिए चाहता हूं।उप-वर्गों में फोर्स टूस्ट्रिंग() कार्यान्वयन

हालांकि डाल:

public abstract String toString(); 

एक संकलन त्रुटि उत्पन्न कर रहा है:

Repetitive method name/signature for method 'java.lang.String toString()' in class ... 

मेरा मानना ​​है कि यह पहले से ही ग्रूवी होने toString परिभाषित की वजह से हो सकता है।

धन्यवाद

+0

.NET के पास आधार कार्यान्वयन को ओवरराइड करने के लिए 'नया' कीवर्ड है। अगर जावा में कुछ भी समान है तो मैं उत्सुक हूं। –

उत्तर

10

toString()java.lang.Object कक्षा का हिस्सा है जिसका पहले से ही इसके लिए एक डिफ़ॉल्ट कार्यान्वयन है। तो आप अनिवार्य रूप से इसे लागू करने के लिए उप-वर्गों को मजबूर नहीं कर सकते हैं। यदि आप इस प्रकार के व्यवहार को मजबूर करना चाहते हैं (सुनिश्चित नहीं है) तो आप

public class abstract SuperClass 
{ 
    public abstract String myToString(); 

    public String toString() 
    { 
    //print super class fileds 

    //enable subclass to do the printing 
    myToString(); 
    } 
} 
+0

स्पष्टीकरण और कार्यवाही के लिए धन्यवाद – Dopele

+0

पेंजे का जवाब काम करेगा, लेकिन यदि आप इसे दूर कर रहे हैं और अपने ग्राहकों को अपना रास्ता या राजमार्ग स्वीकार करने के लिए मजबूर कर रहे हैं, तो आपको शायद अमूर्त वर्ग में स्ट्रिंग() अंतिम बनाना चाहिए। मेरी राय में, हालांकि, आप यहां अपने ग्राहकों का थोड़ा अधिक नियंत्रण कर सकते हैं। Java.lang.Object आपको क्या देता है उससे परे ToString के कार्यान्वयन को मजबूर क्यों कर रहे हैं? –

0

आप उन्हें toString() ओवरराइड करने के लिए बाध्य नहीं कर सकता है, लेकिन आप कर सकता है, सार माता पिता कक्षा में, toString है() फोन एक और मीटर सार विधि, youGottaOverideToString(), उपवर्गों करना होगा जो लागू।

6

संक्षिप्त उत्तर: संभव नहीं है। लांग जवाब: आप की कोशिश कर सकते बजाय निम्न तरीके से वह चारों ओर पाने के लिए, माता पिता कक्षा में लागू:

public final String toString() { 
    getString(); 
} 

public abstract String getString(); 

इस कारण बच्चे वर्ग "GetString()" विधि लागू करने की आवश्यकता है। हालांकि, बच्चे के बच्चे (पोते) वर्ग के बच्चे को उस विधि को लागू करने के लिए मजबूर होने की कोई गारंटी नहीं है यदि बाल वर्ग "getString()" विधि लागू करता है। उदाहरण:

A is the parent class, with the getString() method. 
B extends A, and implements the getString() method. 
C extends B, doesn't have to implement the getString() method. 

आशा में मदद करता है :)

13

यह मेरे लिए काम करता है। क्या यह नया है या दूसरों ने इसे याद किया है?

public abstract class Filterable 
{ 
    @Override 
    public abstract String toString(); 
} 

public class ABC extends Filterable 
{ 
    // Won't compile without toString(); 
} 
+0

मैं इस पैटर्न का उपयोग किसी समस्या के साथ भी नहीं करता –

+2

यह केवल तभी काम करेगा जब अभिभावक वर्ग को 'अमूर्त' बनाया गया हो, लेकिन शायद वैसे भी वांछित वांछित है। – Menachem

0

आप एक यूनिट टेस्ट लिख सकते हैं जो आपके सार वर्ग को विस्तारित करने वाले सभी वर्गों का पता लगाएगा और सत्यापित करेगा कि वे स्ट्रिंग() को घोषित करते हैं। स्कैन करने के लिए आप Reflections लाइब्रेरी का उपयोग कर सकते हैं:

@Test 
    public void validateToString() { 
    final Reflections dtoClassesReflections = new Reflections(new ConfigurationBuilder() 
     .setUrls(ClasspathHelper.forPackage("my.base.package")) 
     .filterInputsBy(new FilterBuilder() 
     .include(".*Dto.*") // optionally filter only some particular classes 
     .exclude(".*Test.*")) // exclude classes from tests which will be scanned as well 
     .setScanners(new SubTypesScanner(false))); 

    final Set<Class<?>> allDtoClasses = dtoClassesReflections.getSubTypesOf(YourAbstractClass.class); // you set your class here (!!). You can set Object.class to get all classes 

    allDtoClasses.forEach(dtoClass -> { 
     logger.info("toString() tester testing: " + dtoClass); 

     try { 
     dtoClass.getDeclaredMethod("toString"); 
     } catch (NoSuchMethodException e) { 
     fail(dtoClass + " does not override toString() method"); 
     } 
    }); 


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