package mainimport "fmt"type IA interface { A() B()}type AbsA struct { IA}type CA struct { AbsA}func (a CA) B() { fmt.Println("Show B")}func (a AbsA) A() { fmt.Println("Show A") a.B()}func t7() { var a IA a = CA{} a.A()}func main() { t7()}运行这个会得到一个 nil 指针 panic,因为当AbsA调用 时B(),它会使用内嵌的IA,但是IA是一个接口。有什么办法可以使这项工作?编辑我尝试做一个抽象的超类,AbsA只实现了接口的一部分,但是需要用到其他的函数,A是AbsA的子类,只实现了接口的其余部分。但这看起来很糟糕,有没有其他方法可以做到这一点?实际上,我只是想做这样的事情func (a IA)A(){ fmt.Println("Show A") a.B()}但是 go 不能使用接口作为接收器。
2 回答
POPMUISE
TA贡献1765条经验 获得超5个赞
不,至少不像你在这里设计的那样。我不完全确定您要完成什么,但这是对嵌入的非常差的使用。它不起作用的原因是因为该CA
类型依赖于AbsA
方法的嵌入类型,该方法A()
然后调用“方法 b”,但唯一的实际实现将B()
CA 作为接收类型,因此一旦您调用了嵌入类型的实现A()
它无法回调到 的嵌入类型实现B()
。
您将嵌入视为两条路,但实际上嵌入类型知道其嵌入的所有方法,而嵌入对嵌入器一无所知。在我个人看来,这应该会产生编译器错误。也许在未来的版本中它会(如果我能在编译时告诉您编译器也应该能够 100% 地遇到运行时错误,对吗?)。
因为它是现在你要么需要实现B()
与类型的接收器Absa
或添加的另一种实现方式A()
与类型的接收器CA
。我不确定你想要完成什么,所以我不能说最好的行动方案是什么。请注意,如果我将此与传统的 OOP 继承相关联,我会将您的代码描述为尝试从父类中访问子类的属性,显然这是不可能的。Absa
将永远无法调用B()
为嵌入它的类型定义的实现。就像尝试使用在从父级继承的类型上定义的方法永远不会工作或仅在大多数 OOP 语言中有意义一样,您会收到编译时错误。
- 2 回答
- 0 关注
- 225 浏览
添加回答
举报
0/150
提交
取消