inheritance - Golang : when typecasting child struct to parent struct, 子结构信息丢失?

标签 inheritance struct go subclass

例如,将父结构嵌入到子结构中后:

type ParentNode struct {
}

type ChildNode struct {
    ParentNode
    Ident string
}

func ParentType() ParentNode { 
    child := ChildNode{Ident : "node"}
    fmt.Println(child)
    return child.ParentNode 
}

func main() {
    x := ParentType()
    fmt.Println(x.Ident)

}

这是否会打印出“node”,并返回包含所有信息的包含在父结构中的子结构,以便我们可以在拥有实际子结构的同时操作明显的父结构?这个想法类似于 Java,您可以返回表面类型的 List,但返回实际类型的 LinkedList。

如果没有,实现此功能的最佳方法是什么?本质上,我想将 Child 结构向上转换为父结构,但像操作子结构一样操作它。有没有办法使用接口(interface)来解决这个问题?

如何消除 fmt.Println(x.Ident) 行中的错误“x.Ident undefined(类型 ParentNode 没有字段或方法 Ident)”

最佳答案

它不会返回子结构。您所做的不是对子结构进行类型转换,而只是返回其字段之一。使用更具体的示例,上面的 go 代码片段就像尝试使用 Employee 的名称,就好像它是 Employee 的父类(super class)一样。

不过,您的猜测是正确的,实现像 ArrayList 和 List 这样的“is-a”关系的方法是使用接口(interface)。但要知道,接口(interface)只能为方法调用提供多态性,而不能为字段访问提供多态性。您的示例的修改版本希望有所帮助,可以在以下位置找到:

http://play.golang.org/p/qclS5KR64H

您可能会发现阅读 go 规范的“结构类型”部分和/或整个规范很有帮助(它没有那么长!也没有那么可怕!):

https://golang.org/ref/spec#Struct_types

关于inheritance - Golang : when typecasting child struct to parent struct, 子结构信息丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716109/

相关文章:

go - 尝试使用 go 接口(interface)实现多态性

go - 通过将键与字符串数组进行比较来从 map 中检索

go - 在包内初始化订单

c++ - C++中移动赋值运算符的继承

java - 为什么我们不能在子类中分配较弱的特权

c# - 是否有结构继承的实用替代方案? (C#)

c++ - 如何在 Windows 上紧密打包结构?

c# - 有没有一种通用的方法可以将结构写入 Big Endian 格式的字节?

c - 访问非空结构成员时出现段错误-

c++ - 调用unique_ptr子类继承的模板构造函数