2011-01-09 14 views
6

सी में मैं इसउपवर्गीकरण

struct Point { 
    int x,y; 
} 

struct Circle { 
    struct Point p;  // must be first! 
    int rad; 
} 

void move(struct Point *p,int dx,int dy) { 
    .... 
} 

struct Circle c = .....; 
move((struct Point*)&c,1,2); 

की तरह कुछ कर सकते हैं इस दृष्टिकोण का उपयोग करते हुए जाना है, मैं किसी भी struct (सर्किल, आयत, आदि) पहले सदस्य के रूप में struct प्वाइंट है कि पारित कर सकते हैं। मैं Google go में ऐसा कैसे कर सकता हूं?

+0

एक बहुत गड़बड़-अप उदाहरण है कि, क्यों नहीं का उपयोग करें: 'चाल (और c.p, 1, 2)' 'Circle' की स्मृति लेआउट पर निर्भर रहने के बजाय? साथ ही, यह सभी आकारों तक स्केल नहीं करता है, जब तक कि आप हमेशा अपने बैरिएंटर से आकार को परिभाषित न करें? –

+0

कोज़ सर्किल आंतरिक विवरण निर्यात नहीं किए जाते हैं। सर्कल को क्लाइंट के लिए अपारदर्शी प्रकार माना जाता है। – Nyan

उत्तर

7

हालांकि जाओ प्रकार और विधियों है और प्रोग्रामिंग की एक वस्तु उन्मुख शैली की अनुमति देता है, वहाँ कोई प्रकार पदानुक्रम है। गो में "इंटरफेस" की अवधारणा एक अलग दृष्टिकोण प्रदान करती है जो हमें विश्वास है कि उपयोग करना आसान है और कुछ तरीकों से अधिक सामान्य है। अन्य प्रकारों में प्रकारों को एम्बेड करने के तरीके कुछ समान प्रदान करते हैं- लेकिन समान-सबक्लासिंग के समान नहीं हैं। Is Go an object-oriented language?, FAQ.

उदाहरण के लिए

,

package main 

import "fmt" 

type Mover interface { 
    Move(x, y int) 
} 

type Point struct { 
    x, y int 
} 

type Circle struct { 
    point Point 
    rad int 
} 

func (c *Circle) Move(x, y int) { 
    c.point.x = x 
    c.point.y = y 
} 

type Square struct { 
    diagonal int 
    point Point 
} 

func (s *Square) Move(x, y int) { 
    s.point.x = x 
    s.point.y = y 
} 

func main() { 
    var m Mover 
    m = &Circle{point: Point{1, 2}} 
    m.Move(3, 4) 
    fmt.Println(m) 
    m = &Square{3, Point{1, 2}} 
    m.Move(4, 5) 
    fmt.Println(m) 
} 
+0

यह सी कोड के समान नहीं है। ले जाएं() कोड हर प्रकार के लिए डुप्लिकेट किया गया है ... – Nyan

+2

पीटरएसओ का जवाब मूर्खतापूर्ण गो है; जाओ किसी पॉइंटर को किसी अन्य पॉइंटर पर कास्टिंग करने की अनुमति नहीं देता है, केवल एक मिलान करने वाले इंटरफ़ेस को पॉइंटर कास्टिंग करता है - इसलिए, उसने एक इंटरफेस और कई प्रकार के अनुपालन को परिभाषित किया है। – swdunlop

11

वास्तव में, यह करने के लिए एक सरल तरीका है, जो अधिक ओपी के उदाहरण की तरह है:

type Point struct { 
    x, y int 
} 

func (p *Point) Move(dx, dy int) { 
    p.x += dx 
    p.y += dy 
} 

type Circle struct { 
    *Point // embedding Point in Circle 
    rad int 
} 

// Circle now implicitly has the "Move" method 
c := &Circle{&Point{0, 0}, 5} 
c.Move(7, 3) 

भी ध्यान दें कि सर्किल भी पूरा होगा पीटर एसओ पोस्ट किया गया प्रेमी इंटरफ़ेस।

http://golang.org/doc/effective_go.html#embedding

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