Как правильно использовать композицию в Go - PullRequest
0 голосов
/ 17 декабря 2018

Я новичок на ходу;у меня есть два файла с одинаковым поведением, и ему было приказано использовать композицию, чтобы избежать дублирования кода, но он не вполне понимает концепцию композиции.

Оба файла имеют общую функциональность, но имеют различия между собой.


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 голосов
/ 17 декабря 2018

Golang использует композицию.

  1. Композиция объекта: Композиция объекта используется вместо наследования (которое используется в большинстве традиционных языков).Композиция объекта означает, что объект содержит объект другого объекта (скажем, Объект X) и делегирует ему обязанности объекта X.Здесь, вместо переопределения функций (как в наследовании), вызовы функций, делегированные внутренним объектам.
  2. Состав интерфейса: В составе интерфейса и интерфейсе можно создавать другой интерфейс, и весь набор методов, объявленных во внутреннем интерфейсе, становится его частью.interface.

Теперь, чтобы конкретно ответить на ваш вопрос, вы говорите о композиции интерфейса здесь.Вы также можете увидеть фрагмент кода здесь: 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()
}
...