亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Golang 中使用組合的正確方法是什么

在 Golang 中使用組合的正確方法是什么

Go
開心每一天1111 2022-10-17 10:16:49
我是 OOP 人,最近我必須在 Golang 上工作,這是我以前沒有做過的語言。雖然我已經閱讀了很多關于組合的文章,但我注意到在 Golang 上正確使用它有點棘手假設我有兩個 Golang 組合的例子,我不知道哪個是正確的,它們之間會有所不同嗎?謝謝第一個例子type BaseClass struct {   db *DB}func NewBaseClass(db *DB) *BaseClass {  return &BaseClass{db}}type ChildrenClass1 struct {     baseClass *BaseClass}func NewChildrenClass1(db *DB) *ChildrenClass1 {  baseClass := NewBaseClass(db)  return &ChildrenClass1{baseClass}}type ChildrenClass2 struct {     baseClass *BaseClass}func NewChildrenClass2(db *DB) *ChildrenClass2 {  baseClass := NewBaseClass(db)  return &ChildrenClass2{baseClass}}func main(){  db := NewDB()  chilrend1 := NewChildrenClass1(db)  chilrend2 := NewChildrenClass2(db)}第二個例子type BaseClass struct {   db *DB}func NewBaseClass(db *DB) *BaseClass {  return &BaseClass{db}}type ChildrenClass1 struct {     baseClass *BaseClass}func NewChildrenClass1(baseClass *BaseClass) *ChildrenClass1 {  return &ChildrenClass1{baseClass}}type ChildrenClass2 struct {     baseClass *BaseClass}func NewChildrenClass2(baseClass *BaseClass) *ChildrenClass2 {  return &ChildrenClass2{baseClass}}func main(){  db := NewDB()  baseClass := NewBaseClass(db)  chilrend1 := NewChildrenClass1(baseClass)  chilrend2 := NewChildrenClass2(baseClass)}
查看完整描述

1 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

在 Go中,您可能找不到像在許多其他基于 OOP 的語言中那樣定義組合或聚合的正確方法。這只是因為Go 沒有類,沒有對象,沒有異常,也沒有模板。

但是 Go 有結構。結構是用戶定義的類型。結構類型(帶有方法)的用途與其他語言中的類類似。

說了這么多,讓我們看看一些常見的定義,看看我們能做什么:

組合意味著孩子不能獨立于父母而存在的關系。示例:房屋(父)和房間(子)。房間不存在獨立于房屋[ 1 ]。

另一方面,聚合意味著孩子可以獨立于父母而存在的關系。示例:教室(家長)和學生(孩子)。刪除教室,學生仍然存在[ 1 ]。

因此,在聚合和組合中,“實例”“擁有”另一種類型的對象。但是有一個微妙的區別:聚合意味著子可以獨立于父而存在的關系。組合意味著孩子不能獨立于父母而存在的關系。

到目前為止,這就是我們現在從composition中所知道的:

  • 沒有父母,孩子就無法存在

  • 組合是指將更簡單的類型組合成更復雜的類型

  • 當然,我們主要使用它來重用代碼

回答您的問題: 兩者看起來都正確,但是,

  • 第一個例子更接近于composition,因為沒有父母,孩子就不會存在;

  • 第二個例子更像是一個聚合,因為如果你刪除父級,子級將保持存在。

我重寫了您的代碼以嘗試舉例說明:

第一個例子重寫

package main


//Lamp struct is here to suppress the *DB that was in the original example

type Lamp struct {}


type Room struct {

    Lamps *[]Lamp

}



func NewRoom(l *[]Lamp) *Room {

  return &Room{l}

}


type House1 struct {

    Room *Room

}


func NewHouse1(l *[]Lamp) *House1 {

  r := NewRoom(l)

  return &House1{r}

}


type House2 struct {

    Room *Room

}


func NewHouse2(l *[]Lamp) *House2 {

  r := NewRoom(l)

  return &House2{r}

}


func main(){

  lamps := []Lamp{}

  house1 := NewHouse1(&lamps)

  house2 := NewHouse2(&lamps)

}

第二個例子重寫:


package main


type LibraryCard struct {}


type Student struct {

   LibCard *LibraryCard

}


func NewStudent(l *LibraryCard) *Student {

  return &Student{l}

}


type Classroom1 struct {

    Student *Student

}


func NewClassroom1(s *Student) *Classroom1 {

  return &Classroom1{s}

}


type Classroom2 struct {

    Student *Student

}


func NewClassroom2(s *Student) *Classroom2 {

  return &Classroom2{s}

}


func main(){

  lc := new(LibraryCard)

  student := NewStudent(lc)

  classroom1 := NewClassroom1(student)

  classroom2 := NewClassroom2(student)

}


查看完整回答
反對 回復 2022-10-17
  • 1 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號