質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

482閲覧

Goでpythonの継承のようなものを行い,異なる構造体をリストみたいなものに格納したい.

rikuanpg9294

総合スコア15

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2022/06/24 04:59

編集2022/06/24 05:07

Goでpythonの継承のようなものを行い,異なる構造体をリストみたいなものに格納したい.

go

1type PlayersStruct struct { 2 players []Player 3} 4 5var Players = PlayersStruct{} 6 7func create_players() { 8 human := Human{Player{"MY", 500}} 9 computer1 := Computer{Player{"C1", 500}} 10 computer2 := Computer{Player{"C2", 500}} 11 computer3 := Computer{Player{"C3", 500}} 12 Players.players = append(Players.players, &human) 13 Players.players = append(Players.players, &computer1) 14 Players.players = append(Players.players, &computer2) 15 Players.players = append(Players.players, &computer3) 16}

異なる構造体なのでエラーが出てしまった。

go

1type Base interface { 2 bet() 3 info() 4} 5 6type Players interface { 7 Base 8}

interfaceを用いて書いてみたがinterfaceのせいで humanとcomputer両方にbet() info()
がなかったら動かなかった。humanにはbet() info() computerにはinfo()だけ行うようにしたいがうまく書くことができませんでした。

どのようにすれば以下のコードをGoに書き換えれるでしょうか?

python

1players = [] 2class Player: 3 def __init__(self, name, coin): 4 self.name = name 5 self.coin = coin 6 def info(self): 7 def set_bet_coin(self,bet_coin): 8 9class Human(Player): 10 def __init__(self, name, coin): 11 super().__init__(name, coin) 12 def bet(self): 13 14class Computer(Player): 15 def __init__(self, name, coin): 16 super().__init__(name, coin) 17 18create_players(): 19 global players 20 h= H('MY', 500) 21 c1 = C('C1', 500) 22 c2 = C('C2', 500) 23 c3 = C('C3', 500) 24 players = [h,c1,c2,c3] 25

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな感じでどうだろうか?

https://go.dev/play/p/rkz0vH_kASu

go

1package main 2 3type Base interface { 4 info() 5} 6 7type Human interface { 8 Base 9 bet() 10} 11 12func ComInfo(c Base) { 13 c.info() 14} 15 16func HumanProc(h Human) { 17 h.info() 18 h.bet() 19} 20 21type BaseImpl struct{} 22 23func (b *BaseImpl) info() {} 24 25func NewComputer() Base { 26 return &BaseImpl{} 27} 28 29type HumanImpl struct { 30 BaseImpl 31} 32 33func NewHuman() Human { 34 return &HumanImpl{} 35} 36 37func (h *HumanImpl) bet() {} 38 39func main() { 40 h := NewHuman() 41 ComInfo(h) 42 HumanProc(h) 43 com := NewComputer() 44 bases := []Base{} 45 bases = append(bases, h, com) 46}

Computerに必要な機能、Humanに必要な機能を列挙して、共通のものに分類してという設計は継承を使う場合と同じです。
あと、注意が必要なのは、メソッドの頭文字が大文字でなければパッケージを分けたときにアクセスできないです。

投稿2022/06/24 16:16

編集2022/06/24 23:36
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rikuanpg9294

2022/06/25 10:22

ありがとうございます。とてもわかりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問