Go 中的接口支持多态性,允许您创建可以与实现这些接口的任何类型一起使用的泛型类型。然而,与 Java 或 C 等语言不同,Go 不支持多重继承。这就提出了如何实现某些设计模式的问题,例如使用“应该实现”两个接口的类型,而不需要继承。
隐藏您的结构类型并表示它作为一个接口:
type Card interface { GetFace() string GetSuit() string }
您还想为您的 Card 接口定义一个 String() 方法,但这提出了一个挑战,因为您无法将接口传递给String() 方法的实现。
不要使用隐藏结构体并仅导出接口的反模式,请考虑以下方法:
隐藏结构体字段以防止外部修改,但导出指向它:
type Card struct { // ... struct fields here } func NewCard(...) *Card { // ... }
为指向 Card 结构的指针定义 String() 方法:
func (c *Card) String() string { // ... }
这种方法允许您:
虽然“接口隐藏”模式看起来很吸引人,但它可能会导致封装不良、损害文档并引入不必要的复杂性。推荐的导出结构体指针并在指针类型上实现 String() 方法的方法提供了更清晰、更有效的解决方案。
以上是如何在没有多重继承的情况下有效实现Go接口的方法?的详细内容。更多信息请关注PHP中文网其他相关文章!