Как создать подкласс в Go - PullRequest
       8

Как создать подкласс в Go

6 голосов
/ 09 января 2011

В CI можно сделать что-то подобное

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

Используя этот подход, я могу передать любую структуру (Circle, Rectangle и т. Д.), Которая имеет структуру Point в качестве первого члена.Как я могу сделать то же самое в Google Go?

Ответы [ 2 ]

13 голосов
/ 15 января 2011

На самом деле, есть более простой способ сделать это, который больше похож на пример OP:

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)

Также обратите внимание, что Circle также будет выполнять интерфейс Mover, который выложил PeterSO.

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

7 голосов
/ 09 января 2011

Хотя Go имеет типы и методы и допускает объектно-ориентированный стиль программирования, иерархия типов отсутствует.Концепция «интерфейса» в Go предоставляет другой подход, который, на наш взгляд, прост в использовании и в некоторых отношениях более общий.Существуют также способы встраивания типов в другие типы для обеспечения чего-то аналогичного, но не идентичного подклассам. Является ли Go объектно-ориентированным языком ?, 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...