理解 Go 中的多态性
多态性,即对象采取不同形式的能力,在 Go 中通过接口实现。
问题:
考虑一个假设场景,其中包含代表交易的 BaseTX 结构以及两种专门的交易类型:RewardTX 和AllowanceTX。 AllowanceTX 扩展了 BaseTX,添加了一个附加字段。任务是实现一个对两种事务类型进行操作的函数,使用 json.Marshal() 序列化并保存各自的数据。然而,当前的实现仅序列化 BaseTX 结构中的字段,省略了 AllowanceTX 中的附加字段。
这是现代 Go 的方法:
Go 不支持传统的对象继承,仅依靠接口实现多态性。要解决此问题,请考虑以下替代实现:
type TXapi interface { logicAndSaveTX() } type Metadata struct { Field1 string Field2 string } type RewardTX struct { Metadata } func (tx RewardTX) logicAndSaveTX() { // Logic to overwrite or modify `Metadata` fields ... fmt.Printf("saved this object: %+v \n", tx) } type AllowanceTX struct { Metadata AddField string } func (tx AllowanceTX) logicAndSaveTX() { // Logic to overwrite or modify `Metadata` fields ... // Additional logic for `AddField` ... fmt.Printf("saved this object: %+v \n", tx) }
在这种方法中,元数据成为一个独立的结构,允许在每个 RewardTX 或 AllowanceTX 类型中的嵌入元数据字段上进行专门的行为。 logicAndSaveTX() 方法现在专门针对各自的类型进行操作,适当地处理公共字段和唯一字段。
Go 中的多态性是通过接口实现的,提供了一种灵活有效的方法来处理具有相似行为的不同对象类型。通过采用这种方法,您可以避免传统继承的限制,并充分利用 Go 基于接口的设计的优势。
以上是Go如何在没有对象继承的情况下实现多态?的详细内容。更多信息请关注PHP中文网其他相关文章!