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

Go中如何正确使用组合

Go中如何正确使用组合

Go
qq_遁去的一_1 2023-05-15 15:43:52
我是新来的;有两个共享相似行为的文件,并被告知使用组合来避免重复代码,但不能完全理解组合的概念。这两个文件具有共同的功能,但又各有不同。播放器1.gopackage gametype confPlayer1 interface {    Set(string, int) bool    Move(string) bool    Initialize() bool}func Play(conf confPlayer1) string {    // code for Player1}// ... other funcs播放器2.gopackage gametype 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 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

Golang 使用组合。

  1. 对象组合:使用对象组合代替继承(在大多数传统语言中使用)。对象组合意味着一个对象包含另一个对象(比如对象 X)的对象,并将对象 X 的职责委托给它。这里不是覆盖函数(如在继承中),而是将函数调用委托给内部对象。

  2. 接口组合:在接口组合中,接口可以组合其他接口,并使在内部接口中声明的所有方法集成为该接口的一部分。

现在具体回答你的问题,你这里说的是界面组成。您还可以在此处查看代码片段:https ://play.golang.org/p/fn_mXP6XxmS

检查以下代码:

播放器2.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.

}

播放器1.go


package game


type confPlayer1 interface {

    confPlayer2

    Initialize() bool

}


func Play(conf confPlayer1) string {

    // code for Player1

}

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


现在你可以为播放器 2 使用接口 confPlayer2,为播放器 1 使用 confPlayer1。请参阅下面的代码片段:


播放器.go


package game


type Player struct{

  Name string

  ...........

  ...........

}



func (p Player) Set(){

  .......

  .......

}


func (p Player) Move(){

  ........

  ........

}



func Play(confPlayer2 player){

   player.Move()

   player.Set()

}


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

添加回答

举报

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