Inheritance Go:可以将结构指定给接口,但不能指定上层结构

Inheritance Go:可以将结构指定给接口,但不能指定上层结构,inheritance,interface,go,Inheritance,Interface,Go,以下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() {

以下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中那样将矩形实例指定给多边形引用。这背后的基本原理是什么?

问题是,您认为在其他结构中嵌入结构的能力是继承,而事实并非如此。Go不是面向对象的,它没有任何类或继承的概念。embedded struct语法只是一个很好的简写,它允许一些语法上的糖分。代码的Java等价物更接近于:

类多边形{
内侧面,面积;
}
类矩形{
多边形p;
int foo;
}
我想你是在想象它相当于:

类多边形{
内侧面,面积;
}
类矩形扩展多边形{
int foo;
}

事实并非如此。

问题在于,您将结构嵌入其他结构中的能力视为继承,而事实并非如此。Go不是面向对象的,它没有任何类或继承的概念。embedded struct语法只是一个很好的简写,它允许一些语法上的糖分。代码的Java等价物更接近于:

类多边形{
内侧面,面积;
}
类矩形{
多边形p;
int foo;
}
我想你是在想象它相当于:

类多边形{
内侧面,面积;
}
类矩形扩展多边形{
int foo;
}

事实并非如此。

它是什么语言?肯定不是Java。正在删除“Java”标记。请用正确的语言标记问题。它是什么语言?肯定不是Java。正在删除“Java”标记。请用正确的语言标记问题。因此Go只支持“has-a”关系,而不支持“is-a”关系?我想你可以这样说,尽管大多数人用这些术语来描述它。Go支持带字段的结构,这些字段可以是任何有效类型,并且由于结构是有效类型,所以这些字段可以是结构。“直接在包含结构上调用方法”模式只是一种方便,而不是真正的语言特性。是的,np!如果您熟悉C,Go结构比Java类更接近C结构。所以Go只支持“has-a”关系,而不支持“is-a”关系?我想您可以这样说,尽管大多数人都用这些术语来定义它。Go支持带字段的结构,这些字段可以是任何有效类型,并且由于结构是有效类型,所以这些字段可以是结构。“直接在包含结构上调用方法”模式只是一种方便,而不是真正的语言特性。是的,np!如果您熟悉C,Go结构比Java类更接近C结构。