如何在Go中正确使用合成

时间:2018-12-17 04:24:57

标签: go composition reusability

我是新来的;有两个文件具有相似的行为,并被告知使用组合以避免重复的代码,但不能完全理解组合的概念。

这两个文件具有共同的功能,但彼此之间的差异。


player1.go

package game

type confPlayer1 interface {
    Set(string, int) bool
    Move(string) bool
    Initialize() bool
}

func Play(conf confPlayer1) string {
    // code for Player1
}

// ... other funcs

player2.go

package game

type confPlayer2 interface {
    Set(string, int) bool
    Move(string) bool
    // Initializer is only for Player1
}

func Play(conf confPlayer2) string {
    // code for Player2, not the same as Player1.
}

// ... the same other funcs from player1.go file
// ... they differ slighly from player1.go funcs

是否可以将所有内容合并到一个 player.go 文件中?

1 个答案:

答案 0 :(得分:1)

  

Golang使用合成。

     
      
  1. 对象组合:使用对象组合代替继承(在大多数传统语言中都使用继承)。   对象组合意味着一个对象包含另一个对象   对象(例如对象X)并将对象X的职责委托给它。   在这里,函数而不是覆盖函数(如在继承中)   委托给内部对象的呼叫。
  2.   
  3. 接口组成:在接口组成中,接口可以组成其他接口,并在其中声明了所有方法集   内部接口成为该接口的一部分。
  4.   

现在要专门回答您的问题,您在这里谈论的是界面组成。您还可以在此处查看代码段:https://play.golang.org/p/fn_mXP6XxmS

检查以下代码:

player2.go

package game

type confPlayer2 interface {
    Set(string, int) bool
    Move(string) bool
    }

func Play(conf confPlayer2) string {
    // code for Player2, not the same as Player1.
}

player1.go

package game

type confPlayer1 interface {
    confPlayer2
    Initialize() bool
}

func Play(conf confPlayer1) string {
    // code for Player1
}

在上面的代码片段中,confPlayer1接口已在其中组成接口confPlayer2,除了Initialize函数只是confPlayer1的一部分。

现在,您可以将接口confPlayer2用于播放器2,将confPlayer1用于播放器1。参见下面的代码段:

player.go

package game

type Player struct{
  Name string
  ...........
  ...........
}


func (p Player) Set(){
  .......
  .......
}

func (p Player) Move(){
  ........
  ........
}


func Play(confPlayer2 player){
   player.Move()
   player.Set()
}