Understanding Polymorphism in Go
Polymorphism, the ability for an object to take different forms, is implemented in Go through interfaces.
Problem:
Consider a hypothetical scenario with a BaseTX struct representing a transaction, and two specialized transaction types: RewardTX and AllowanceTX. AllowanceTX extends BaseTX, adding an additional field. The task is to implement a function that operates on both transaction types, serializing and saving their respective data using json.Marshal(). However, the current implementation only serializes fields from the BaseTX struct, omitting the additional field in AllowanceTX.
Here's How Modern Go Approaches This:
Go does not support traditional object inheritance, relying solely on interfaces for polymorphism. To resolve this issue, consider the following alternative implementation:
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) }
In this approach, Metadata becomes a standalone struct, allowing for specialized behavior on the embedded Metadata fields within each RewardTX or AllowanceTX type. The logicAndSaveTX() methods now operate specifically on their respective types, handling both common and unique fields appropriately.
Polymorphism in Go is achieved through interfaces, providing a flexible and efficient way to handle diverse object types with similar behavior. By embracing this approach, you avoid the limitations of traditional inheritance and fully utilize the strengths of Go's interface-based design.
以上是Go如何在沒有物件繼承的情況下實現多型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!