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