2011-01-09 12 views
6

Ben bu yaklaşımı kullanarak busınıflara Ben ilk üye olarak yapı Noktası olan herhangi struct (Çember, Dikdörtgen, vs) geçebilir, C

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); 

gibi bir şey yapabilirsiniz gidin. Google'da aynı şeyi nasıl yapabilirim? Git türleri ve yöntemleri vardır ve programlama nesne yönelimli stil izin verse

+0

, neden kullanın: 'hareket (& C.P, 1, 2)' yerine 'Circle' bellek düzeni güvenmek? Aynı zamanda, her zaman bir şekle barycenter'dan tanımlamadığınız sürece, tüm şekillerde ölçeklendirilmez? –

+0

coz Daire iç detayları exported.ie Circle istemcinin opak tipi olması gerekiyor. – Nyan

cevap

7

, hiçbir tür hiyerarşi yoktur. Go'daki “arabirim” kavramı , kullanımı kolay ve bazı yönlerden daha genel olduğuna inandığımız farklı bir yaklaşım sağlar. Ayrıca, 'a diğer türlerde türleri gömmek için yolları vardır, alt sınıflara benzer bir şey sağlar - ancak özdeştir -. Örneğin Is Go an object-oriented language?, FAQ.

, Aslında

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

Bu, C koduyla aynı değil. Move() kodu burada her tür için çoğaltılır ... – Nyan

+2

PeterSO'nun cevabı deyimsel Go; Go, başka bir işaretçiye bir işaretçi yerleştirmeye izin vermez, yalnızca eşleşen bir arabirime bir işaretçi atar - bu nedenle, bir arabirim ve ona bağlı bir dizi tanımlamıştır. – swdunlop

11

, OP'ın örnek daha benzer olduğunu bunu yapmak için basit bir yol olmasa:

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) 

Ayrıca Çember de yerine getireceğini fark PeterSO'nun gönderdiği Mover arabirimi. Oldukça berbat örnek

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