2013-02-16 102 views
7

यहाँ के लिए सुपर वर्ग विधि के लिए कॉल करने के लिए मैं क्या पूछने के लिएजावा बहुरूपता कैसे उपवर्ग वस्तु

सुपर क्लास Name.java

public class Name{ 
    protected String first; 
    protected String last; 

     public Name(String firstName, String lastName){ 
     this.first = firstName; 
     this.last = lastName; 
     } 

     public String initials(){ 
     String theInitials = 
      first.substring(0, 1) + ". " + 
      last.substring(0, 1) + "."; 
     return theInitials; 
     } 

कोशिश कर रहा हूँ का एक उदाहरण है और फिर उपवर्ग ThreeNames.java

है
public class ThreeNames extends Name{ 
    private String middle; 

    public ThreeNames(String aFirst, String aMiddle, String aLast){ 
    super(aFirst, aLast); 
    this.middle = aMiddle; 
    } 

    public String initials(){ 
    String theInitials = 
     super.first.substring(0, 1) + ". " + 
     middle.substring(0, 1) + ". " + 
     super.last.substring(0, 1) + "."; 
    return theInitials; 
    } 

इसलिए यदि मैं ThreeNames example1 = new ThreeNames("Bobby", "Sue" "Smith") के साथ एक Threename वस्तु बनाने और उसके बाद System.out.println(example1.initials()); फोन मैं B.S.S. मिल जाएगा मुझे लगता है कि मिलता है।

मेरा प्रश्न है वहाँ एक रास्ता तो यह है कि मेरी उत्पादन सिर्फ B.S.

+0

के कार्यान्वयन के समान ही है, उत्तर के लिए धन्यवाद! –

+0

संभावित डुप्लिकेट [सबक्लास ऑब्जेक्ट का उपयोग कर सुपर क्लास फ़ंक्शन तक पहुंच] [http://stackoverflow.com/questions/2432249/accessing-super-class-function-using-subclass-object) –

उत्तर

11

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

public String someMethod() { 
    String superResult = super.someMethod(); 
    // go on from here 
} 

लेकिन नहीं thats आप यहाँ क्या देख। आप शायद में अपने विधि बदल सकती है:

public List<String> getNameAbbreviations() { 
    //return a list with a single element 
} 

और फिर उपवर्ग में ऐसा करते हैं:

public List<String> getNameAbbreviations() { 
    List fromSuper = super.getNameAbbreviations(); 
    //add the 3 letter variant and return the list 
} 
+0

यह समझ में आता है कि कोई विधि हो सकती है उप वर्गों में प्रयोग किया जाता है, वे ओवरराइड क्यों करते हैं? बस उस ब्लॉक को किसी अन्य विधि में रखें और उस विधि को मूल विधि में कॉल करें जिसे ओवरराइड किया जा रहा है। –

5

वहाँ यह करने के लिए कई तरीके हैं है नाम के पहले अक्षर विधि का नाम कक्षा में है कि कॉल करने के लिए है। एक तरीका: ThreeNames में Names#initials() ओवरराइड न करें।

एक और तरीका ThreeNames पर एक विधि जोड़ने के लिए है जो Names#initials() पर प्रतिनिधि है।

public class ThreeNames extends Name { 
    // snip... 

    public String basicInitials() { 
     return super.initials(); 
    } 
} 
1

मैं बजाय पहले अक्षर अकेले सुपर क्लास में छोड़ना होगा और एक नया तरीका है कि पूरा वापस आ जाएगी परिचय नाम के पहले अक्षर। तो आपके कोड में मैं बस कुछ और चीज़ों के लिए थ्रीनेम्स में प्रारंभिक विधि का नाम बदलूंगा। इस प्रकार आपकी शुरुआती विधि नाम