【发布时间】:2018-12-07 17:34:19
【问题描述】:
我想我陷入了思考以下问题的多态性解决方案:
假设我有一个BaseTX struct,其中包含交易字段。现在我有两种特殊类型的交易:RewardTX struct 和AllowanceTX struct。
RewardTX struct此时只有BaseTX struct的组成。
AllowanceTX struct 由BaseTX struct 和AddField 组成。
我还有一个函数logicAndSaveTX(),它对BaseTX 的字段有一些逻辑,但最后是使用json.Marshal() 序列化整个对象并将byte[] 保存在某处。
type TXapi interface {
logicAndSaveTX()
}
type BaseTX struct {
Field1 string
Field2 string
}
type RewardTX struct {
BaseTX
}
type AllowanceTX struct {
BaseTX
AddField string
}
func (tx BaseTX) logicAndSaveTX() {
// logic on BaseTX fields; simplified:
tx.Field1 = "overwritten"
tx.Field2 = "logic done"
// here would be marshal to json and save; simplified to print object:
fmt.Printf("saved this object: %+v \n", tx)
}
func SaveTX(tx TXapi) {
tx.logicAndSaveTX()
}
func main() {
rewardTX := RewardTX{BaseTX : BaseTX{Field1: "Base info1", Field2: "Base info2"}}
SaveTX(rewardTX) // should print rewardTX with fields from BaseTX
allowanceTX := AllowanceTX{BaseTX : BaseTX{Field1: "Base info1", Field2: "Base info2"}, AddField: "additional field"}
SaveTX(allowanceTX) // would like to print allowanceTX with fields from BaseTX + AdditionalField >>> instead only printing fields from BaseTX
}
https://play.golang.org/p/0Vu_YXktRIk
我试图弄清楚如何实现结构和功能以对两种事务进行操作,但最后正确地序列化两种结构。我的问题是,AddField 在我当前的实现中没有出现。
也许我在这里有些脑残——我真的很想以“正确的 Go 方式”来实现它。 :)
【问题讨论】:
-
Go 没有像 Java 或 C++ 那样的 继承。 parent-child 类的经典定义中没有类层次结构。您可以获得的最接近的是接口,它就像一个只有抽象方法(没有字段)的抽象类。 Go 更喜欢 IMO 更简单、更容易追踪/阅读的组合。
-
当有人试图通过嵌入来模拟继承时,他会失败并伤害自己。停止尝试:你会失败。将行为封装在一个接口中,你就有了多态性。
标签: oop go polymorphism