为了账号安全,请及时绑定邮箱和手机立即绑定

避免在“子类型”之间重复代码

避免在“子类型”之间重复代码

Go
喵喔喔 2023-07-31 17:30:06
我正在将一个旧的 Java 项目重写为 Go。我已经在工作中完成了一些 Go,但我不知道如何将我的 OOP(带有抽象类等)转换为 Go 哲学。在这个想法中,我有两种类型(很快就会有 3 种),它们有一些通用的方法,但其他一些类型(最多只有 1 或 2 个)应该具有相同的签名,但不具有相同的主体。我知道 Go 没有某种继承。现在我有这样的事情:type A struct {...}func (a *A) M1 (){ stuff1 }func (a *A) M2 (){ stuff2 }func (a *A) SM (){ special stuff A }然后:type B struct {...}func (b *B) M1 (){ stuff1 }func (b *B) M2 (){ stuff2 }func (b *B) SM (){ special stuff B }我不知道 Go 是如何做到这一点的。在 Java 中,我做了一个抽象类,然后用我的两个具体类实现了它。我想要的是不必重复 M1() 和 M2(),而是能够有一个泛型类型来调用这些方法,然后只需为这两种类型定义 SM() 即可。
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

您可以嵌入一个结构,例如:


type Common struct {}


func (c *Common) M1() {

    fmt.Println("M1")

}


func (c *Common) M2() {

    fmt.Println("M2")

}


type A struct {

    Common

}


func (a *A) SM() {

    fmt.Println("A SM()")

}


type B struct {

    Common

}


func (b *B) SM() {

    fmt.Println("B SM()")

}   


type Thing interface {

    M1()

    M2()

    SM()

}

func main() {

    var a Thing = &A{}

    var b Thing = &B{}


    a.M1()

    b.M2()

    a.SM()

    b.SM()

}

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


查看完整回答
反对 回复 2023-07-31
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

有几种不同的方法可以解决这个问题 - 嵌入并不是唯一的答案。如果这些方法想要从伪代码中定义的类型访问数据(例如A.M1需要访问 的字段A),那么嵌入对您没有帮助,因为嵌入类型不知道它嵌入的类型。您需要从整体上重新考虑您的设计并将其视为 Go 程序,而不是将其设计为 Java 程序并尝试使这些概念在 Go 中发挥作用。正如许多人发现的那样,尝试在 Go 中进行 OOP 设计往往会带来很大的挫败感,但成功率却很低。

另一方面,如果这些方法不需要访问任何字段,那么它们为什么是方法呢?这些可能只是纯函数,这将使它们更易于使用和推理,并且完全消除嵌入或伪造继承的任何担忧。


查看完整回答
反对 回复 2023-07-31
  • 2 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信