从Go方法声明文档中可以看到:
接收器类型必须是T或*T的形式,其中T是类型名称。T被称为接收器基础类型或仅为基础类型。基础类型不能是指针或接口类型,并且必须在与方法相同的包中声明。
有人能给我一些关于这个问题的见解吗?是否有其他(静态类型)语言允许这样做?我真的想在一个接口上定义方法,以便将给定接口类型的任何实例视为另一个接口类型。例如(从模板方法模式维基百科文章中借用示例),如果以下内容是有效的:
接收器类型必须是T或*T的形式,其中T是类型名称。T被称为接收器基础类型或仅为基础类型。基础类型不能是指针或接口类型,并且必须在与方法相同的包中声明。
有人能给我一些关于这个问题的见解吗?是否有其他(静态类型)语言允许这样做?我真的想在一个接口上定义方法,以便将给定接口类型的任何实例视为另一个接口类型。例如(从模板方法模式维基百科文章中借用示例),如果以下内容是有效的:
type Game interface {
PlayOneGame(playersCount int)
}
type GameImplementation interface {
InitializeGame()
MakePlay(player int)
EndOfGame() bool
PrintWinner()
}
func (game *GameImplementation) PlayOneGame(playersCount int) {
game.InitializeGame()
for j := 0; !game.EndOfGame(); j = (j + 1) % playersCount {
game.MakePlay(j)
}
game.PrintWinner()
}
我可以使用任何实现了"GameImplementation"的实例作为"Game",无需进行任何转换:
var newGame Game
newGame = NewMonopolyGame() // implements GameImplementation
newGame.PlayOneGame(2)
更新:这是为了尝试在不涉及显式层次结构的情况下实现所有抽象基类的好处。如果我想定义一个新的行为PlayBestOfThreeGames,抽象基类将要求我更改基类本身 - 而在这里,我只需在GameImplementation接口之上定义一个方法即可。