2011-01-09 2 views
6

나는이 방법을 사용하여이서브 클래스는 내가 먼저 구성원으로 구조체의 포인트를 가지고있는 구조체 (원형, 사각형 등)을 전달할 수 있습니다, 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); 

처럼 뭔가를 할 수 있습니다 이동합니다. 어떻게 Google에서 동일한 작업을 수행 할 수 있습니까? 이동은 종류와 방법을 가지고 있으며, 이 프로그래밍의 객체 지향 스타일을 수 있지만

+0

, 왜 안 사용 '이동 (c.p, 1, 2)'대신'Circle'의 메모리 레이아웃에 의존? 또한, 당신은 항상 그것의 barycenter에서 모양을 정의하지 않는 한, 그것은 모든 도형으로 확장되지 않습니다? –

+0

coz 서클 내부 세부 정보는 exported.ie가 아닙니다. 서클은 클라이언트에 대해 불투명 한 유형으로되어 있습니다. – Nyan

답변

7

는 어떤 유형 계층이 없습니다. Go의 "인터페이스" 의 개념은 우리가 사용하기 쉽다고 믿는 다른 접근 방식 인 을 제공하며 어떤 방식으로는 더 일반적인 방식으로 에 있습니다. 에 다른 유형의 유형을 포함 시키려면 가지 방법이 있지만 유사 유형을 제공하지만 동일하지 않은 서브 클래 싱은 없습니다. 예를 들어 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

이것은 C 코드와 다릅니다. 여기에 모든 유형의 Move() 코드가 중복됩니다 ... – Nyan

+2

PeterSO의 대답은 관용적입니다. Go는 다른 포인터에 대한 포인터를 캐스팅하는 것을 허용하지 않고 일치하는 인터페이스에 대한 포인터 만 캐스팅하므로 인터페이스 및 여러 유형의 인터페이스를 정의했습니다. – 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) 

는 또한 원도 이행 할 것을 통지 PeterSO가 게시 한 Mover 인터페이스. 꽤 엉망 업 예제

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