2013-09-07 7 views
10

जंग "पैरेंट विधि" कैसे कॉल करता है? जावा में इस तरह:जंग विरासत: कॉल पेरेंट विधि

public class parent{ 
    ... 
    public void doSomething(){ 
     System.out.println("Parent method"); 
    } 
} 
public class child extends parent{ 
    ... 
    public void doSomething(){ 
     super.doSomething(); 
     System.out.println("Child method."); 
    } 
} 

जाओ में, हम struct में गुमनाम क्षेत्रों से यह अनुकरण कर सकते हैं:

type parent struct{} 

func (self *parent) doSomething() { 
    fmt.Println("parent method") 
} 

type child struct { 
    parent 
} 

func (self *child) doSomething() { 
    self.parent.doSomething() 
    fmt.Println("child method") 
} 
func main() { 
    var c1 child 
    c1.doSomething() 
} 

कैसे जंग में यह अनुकरण करने के लिए? धन्यवाद!

उत्तर

12

यह काफी हुड के नीचे एक ही नहीं है, लेकिन जैसे कुछ

trait DoThings { 
    fn do_something(&self); 
} 

struct Parent; 

impl DoThings for Parent { 
    fn do_something(&self) { println("doing something"); } 
} 

struct Child { 
    parent: Parent 
} 

impl DoThings for Child { 
    fn do_something(&self) { 
     self.parent.do_something(); 
     println("child"); 
    } 
} 

fn main() { 
    let c = Child { parent: Parent }; 
    c.do_something(); 
} 

(इस स्वत: के कुछ हिस्सों बनाने जैसे अगर हम सिर्फ, यानी डॉन 'सीधे माता पिता की विधि कॉल करना चाहता था के लिए कुछ प्रस्तावों रहे हैं बच्चे में विधि को ओवरराइड नहीं करते हैं, तो वर्तमान में किसी को स्पष्ट रूप से माता-पिता की विधि को स्पष्ट रूप से कॉल करना होगा)।

+2

क्या यह अभी भी ऐसा करने का तरीका है या उनके अपडेट हैं? क्षमा करें, मैंने खुद को गुगल किया है लेकिन जंग के लिए अद्यतित जानकारी ढूंढना मुश्किल है। –

+2

@ जेरोन बोलेन, हाँ, अभी भी ऐसा करने का तरीका है। – huon

+2

इसके साथ समस्या यह है कि यह संरचना क्षेत्रों के लिए काम नहीं करेगा। उदाहरण के लिए, यदि आप किसी अन्य स्ट्रक्चर में बेस स्ट्रक्चर फ़ील्ड का पुन: उपयोग करना चाहते हैं तो क्या होगा? 'संरचना पशु {स्वास्थ्य: int; } संरचना कुत्ता {एफएन छाल() ->() {...}} 'कुत्ते पशु के स्वास्थ्य का वारिस कैसे करता है? –

-2

विरासत का बिंदु विरासत विधि को ओवरराइट करने में सक्षम है। उपर्युक्त नमूने अभी भी प्रतिनिधिमंडल के साथ सौदा करते हैं, विरासत के साथ नहीं।

चलो कुछ जाओ कोड पर एक नज़र इस उदाहरण देकर स्पष्ट करना होगा:

type Base struct {} 
func (Base) Magic() { fmt.Print("base magic") } 
func (self Base) MoreMagic() { 
    self.Magic() 
} 

type Foo struct { 
    Base 
} 

func (Foo) Magic() { fmt.Print("foo magic") } 

आप इस तरह से ऊपर कोड चलाते हैं

f := new(Foo) 
f.Magic() 

यह "foo जादू" कंसोल के लिए प्रिंट और नहीं होगा "बेस जादू"। हालांकि, अगर हम इस कोड

f := new(Foo) 
f.MoreMagic() 

चलाने यह "foo जादू" के साथ-साथ, लेकिन इस बार "आधार जादू" मुद्रित नहीं होंगे। यह विरासत की कमी और इस प्रकार विधि जादू (उर्फ गतिशील लिंकिंग) को ओवरराइट करने में सक्षम नहीं है। तो हम अभी भी प्रतिनिधिमंडल से निपट रहे हैं।

आप इस f.ex. के आसपास काम कर सकते हैं। जैसा कि this आलेख में "इनर पैटरन" अनुभाग में वर्णित है। मैं जंग के विषय में इस बारे में बिल्कुल नहीं जानता। पहली नजर में यह वही लगता है।

+0

ध्यान दें कि यह "विरासत की कमी" विरासत से भी स्वतंत्रता है और वास्तव में प्रतिनिधिमंडल आधारित ऑब्जेक्ट मॉडल के मुख्य बिंदुओं में से एक है जो गो का उपयोग करता है। – Lii

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