我是新来的;有两个文件具有相似的行为,并被告知使用组合以避免重复的代码,但不能完全理解组合的概念。
这两个文件具有共同的功能,但彼此之间的差异。
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 文件中?
答案 0 :(得分:1)
Golang使用合成。
- 对象组合:使用对象组合代替继承(在大多数传统语言中都使用继承)。 对象组合意味着一个对象包含另一个对象 对象(例如对象X)并将对象X的职责委托给它。 在这里,函数而不是覆盖函数(如在继承中) 委托给内部对象的呼叫。
- 接口组成:在接口组成中,接口可以组成其他接口,并在其中声明了所有方法集 内部接口成为该接口的一部分。
现在要专门回答您的问题,您在这里谈论的是界面组成。您还可以在此处查看代码段: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()
}