0

次の Go コード:

package main

import "fmt"

type Polygon struct {
    sides int
    area int
}

type Rectangle struct {
    Polygon
    foo int
}

type Shaper interface {
    getSides() int
}

func (r Rectangle) getSides() int {
    return 0
}

func main() {   
    var shape Shaper = new(Rectangle) 
    var poly *Polygon = new(Rectangle)  
}

このエラーが発生します:

cannot use new(Rectangle) (type *Rectangle) as type *Polygon in assignment

Java でできるように、Rectangle インスタンスを Polygon 参照に割り当てることはできません。この背後にある理論的根拠は何ですか?

4

1 に答える 1

4

問題は、構造体を他の構造体に埋め込む機能を継承として考えていることですが、そうではありません。Go はオブジェクト指向ではなく、クラスや継承の概念もありません。組み込みの構造体構文は、いくつかの構文糖衣を可能にする優れた省略表現です。コードに相当する Java は、より厳密です。

class Polygon {
    int sides, area;
}

class Rectangle {
    Polygon p;
    int foo;
}

あなたはそれが次のものと同等であると想像していたと思います:

class Polygon {
    int sides, area;
}

class Rectangle extends Polygon {
    int foo;
}

そうではありません。

于 2013-08-05T01:14:51.127 に答える