Go不是面向对象的。 该 只 多态性围棋的形式是接口。
来自其他面向对象的语言可能很困难,因为您必须摆脱可能要继承的许多想法,例如“基础”类/类型。只需从设计思想中删除“基础”即可;您正在尝试将合成转换为继承,这只会使您陷入麻烦。
在这种情况下,也许您在这里有合理的构图理由;您有一些通用的共享字段供多种类型使用,但这不是“基本”类型。可能是“元数据”之类的东西-
考虑到您的示例非常抽象,我不能说该怎么称呼,但是您知道了。
所以也许您有:
type TXapi interface { logicAndSaveTX()}type metadata struct { Field1 string Field2 string}type RewardTX struct { metadata }func (tx RewardTX) 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)}type AllowanceTX struct { metadata AddField string}func (tx AllowanceTX) logicAndSaveTX() { // logic on baseTX fields; simplified: tx.Field1 = "overwritten" tx.Field2 = "logic done" tx.AddField = "more stuff" // here would be marshal to json and save; simplified to print object: fmt.Printf("saved this object: %+v n", tx)}如果元数据(或其他任何内容)字段的处理在所有用途上都是相同的,则也许您可以给该类型使用它自己的
logicTX方法来填充这些字段,可以通过
logicAndSaveTX嵌入它的结构的调用。
这里的关键是要考虑要 限制在该类型 上的类型的行为(方法),而不是将其视为能够对“子类型”进行操作。子类型不存在,并且 嵌入
在其他类型中的类型也无法在其容器上进行操作。



