栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

去嵌入式结构调用子方法,而不是父方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

去嵌入式结构调用子方法,而不是父方法

实际上,在您的示例

ShapeInterface.PrintArea()
中,对于a而言,调用工作正常,
Circle
因为您
PrintArea()
为该类型创建了一个方法
Circle
。由于您没有
PrintArea()
Rectangle
类型创建,因此
Shape
将调用嵌入式类型的方法。

这不是错误,这是预期的工作。Go 不是(相当)一种面向对象的语言:它没有类,也没有类型继承。但它支持类似的构造,称为在层和层上
嵌入
,并且确实具有方法。

struct``interface


您所期望的被称为 虚拟方法
:您期望该

PrintArea()
方法将调用“重写”
Area()
方法,但是在Go中没有继承和虚拟方法。

的定义

Shape.PrintArea()
是调用
Shape.Area()
,这就是发生的情况。
Shape
不知道它是哪个结构以及是否嵌入其中,因此它无法将方法调用“分派”到虚拟的运行时方法。

的围棋语言规范:选择器描述的评价时,其遵循确切规则

x.f
表达(其中,
f
可以是方法)选择哪种方法,将在结束时调用。关键点:

*选择器

f
可以表示一个字段或方法
f
的类型的
T
,或者它可以指字段或方法
f
嵌套的匿名字段的
T
。走过来达到匿名的字段数
f
被称为其
深度
T

* 对于值
x
类型的
T
*T
其中
T
不是指针或接口类型,
x.f
表示在最浅深度域或方法
T
,其中有这样一个
f

深入细节

在以下情况下

Circle
si.PrintArea()
会叫
Circle.PrintArea()
,因为你创造了这样的方法:

func (c *Circle) PrintArea() {    fmt.Printf("%s : Area %vrn", c.GetName(), c.Area())}

在此方法

c.Area()
中,称为where
c
是a
*Circle
,因此
*Circle
将调用存在接收者的方法。

PrintArea(si)
来电
si.Area()
。由于
si
是,
Circle
并且有一个
Area()
带有
Circle
接收方的方法,因此调用它没有问题。

长方形

在情况下,

Rectangle
si.PrintArea()
实际上会调用该方法,
Shape.PrintArea()
因为您
没有
PrintArea()
为该
Rectangle
类型定义一个方法(receive方法没有任何方法
*Rectangle
)。和执行
Shape.PrintArea()
方法调用
Shape.Area()

没有
Rectangle.Area()
-作为讨论,
Shape
不知道
Rectangle
。所以你会看到

Rectangle1 : Area 0

印刷而不是预期

Rectangle1 : Area 20

但是,如果您调用

PrintArea(si)
(传递了
Rectangle
),则会调用
si.Area()
,这是
Rectangle.Area()
因为该方法存在。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369383.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号