Почему типы приема метода Go не могут быть интерфейсами?

Из документации Go по объявлениям методов :

Тип получателя должен иметь форму 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» как «Игру» без какого-либо преобразования:

var newGame Game
newGame = NewMonopolyGame() // implements GameImplementation
newGame.PlayOneGame(2)

ОБНОВЛЕНИЕ: целью этого было попытаться достичь всех преимуществ абстрактных базовых классов без всякой связи, которая идет с явной иерархией. Если бы я хотел определить новое поведение PlayBestOfThreeGames,абстрактные базовые классы потребовали бы от меня изменения самого базового класса - тогда как здесь я просто определяю еще один метод поверх интерфейса GameImplementation

5
задан Tom Carver 5 June 2011 в 08:09
поделиться