gpt4 book ai didi

go - 在其他父方法中使用重写的父方法

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:50 26 4
gpt4 key购买 nike

我有两种类型,B 和 C,它们共享所有方法,但以不同方式实现其中一种方法。我想通过父类型 A 来表达这一点,其中包含共享方法的实现,并将 A 嵌入 B 和 C 中。(不要重复自己!)问题是 B 和 C 之间的方法不同是调用了许多共享方法。构建此类代码的惯用方式是什么?

我当前的实现基本上是这样的(https://play.golang.org/p/RAvH_hBFDN;基于 Dave Cheney 的示例):

package main

import (
"fmt"
)

type Legger interface {
Legs() int
}

type Cat struct {
Name string
L Legger
}

// Cat has many methods like this, involving calling c.L.Legs()
func (c Cat) PrintLegs() {
fmt.Printf("I have %d legs.\n", c.L.Legs())
}

// OctoCat is a Cat with a particular implementation of Legs
type OctoCat struct {
Cat
}

func (c OctoCat) Legs() int {
return 8
}

// TetraCat has a different implementation of Legs
type TetraCat struct {
Cat
}

func (c TetraCat) Legs() int {
return 4
}

func main() {
c := TetraCat{Cat{"Steve",nil}}
c.L = &c
c.PrintLegs() // want 4
o := OctoCat{Cat{"Bob",nil}}
o.L = &o
o.PrintLegs() // want 8
}

类型定义本身看起来干净整洁,但是 main 中的初始化代码很古怪(首先是结构文字中的 nil,然后是 c.L = &c ,什么?)。有更好的解决方案吗?

is it possible to call overridden method from parent struct in golang? 中提出了类似的模式, 但没有回答这是否是惯用的继续进行方式的问题。

最佳答案

我会考虑两种解决方法:

1. 重构您的代码,使其具有单一类型 Cat,其中包含字段 Name stringLegs int :

package main

import (
"fmt"
)

type Cat struct {
Name string
Legs int
}

func (c *Cat) PrintLegs() {
fmt.Printf("I have %d legs.\n", c.Legs)
}

func main() {
c := &Cat{"Steve", 4}
c.PrintLegs() // want 4
o := &Cat{"Bob", 8}
o.PrintLegs() // want 8
}

https://play.golang.org/p/_PNAu3sgG8

2. 去掉 Cat 类型,只用 TetraCatOctoCat 实现 打腿接口(interface):

package main

import (
"fmt"
)

type Legger interface {
Legs() int
}

func PrintLegs(l Legger) {
fmt.Printf("I have %d legs.\n", l.Legs())
}

// OctoCat is a Cat with a particular implementation of Legs
type OctoCat struct {
Name string
}

func (c *OctoCat) Legs() int {
return 8
}

// TetraCat has a different implementation of Legs
type TetraCat struct {
Name string
}

func (c *TetraCat) Legs() int {
return 4
}

func main() {
c := &TetraCat{"Steve"}
PrintLegs(c) // want 4
o := &OctoCat{"Bob"}
PrintLegs(o) // want 8
}

https://play.golang.org/p/m4QvKhSj0w

关于go - 在其他父方法中使用重写的父方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39311436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com