以下代码失败,因为在使用B.Assign(A)
之后,B
的特定类型的信息丢失了(至少我认为这里出错了):
package main
import "fmt"
type Methods interface {
Method()
Assign(Methods)
Set(Methods)
}
type Parent struct {
Methods
assigned Methods
}
type ChildA struct {
Parent
}
type ChildB struct {
Parent
msg string
}
func (this *Parent) Assign(other Methods) {
//Some other logic here
other.Set(this)
}
func (this *Parent) Set(other Methods) {
this.assigned = other
}
func (c *ChildA) Method() {
fmt.Println("I'm child A")
}
func (c *ChildB) Method() {
fmt.Println("I'm child B, and I approve this message:", c.msg)
}
func main() {
A := new(ChildA)
B := new(ChildB)
B.msg = "my message"
B.Assign(A)
A.assigned.Method()
}
现在,为了避免这种情况,我必须制作另一种方法,它与Parent.Assign()
具有完全相同的定义,但接收方不同:
func (this *Parent) Assign(other Methods) {
//Some other logic here
other.Set(this)
}
func (this *ChildB) Assign(other Methods) {
//Same as above
other.Set(this)
}
这很难看。有没有办法在从嵌入式结构B
调用方法时保留有关Parent
类型的信息,而不重复代码?
答案 0 :(得分:4)
有没有办法在从嵌入式struct Parent调用方法时保留有关B类型的信息,而不重复代码?
没有。当您调用嵌入式方法时,将使用指向嵌入式结构的指针调用它。
不幸的是,尽管它看起来很吸引人,但嵌入式对象并没有使Go成为面向对象的语言。
你可能最好只使用一个带有函数指针的类型来实现。