こんにちは、ナナオです。

前回に引き続き競プロを実施していきたいと思います。

今回の問題は以下です。

クラスの継承 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

以下のように実装しました。

package main
import "fmt"
type Customer interface {
	OrderAlCohol(amount int)
	OrderSoftdrink(amount int)
	OrderFood(amount int)
	GetTotalAmount() int
}
type Children struct {
    TotalAmount int
}
func (c *Children) OrderAlCohol(amount int) {
    return
}
func (c *Children) OrderSoftdrink(amount int) {
    c.TotalAmount += amount
}
func (c *Children) OrderFood(amount int) {
    c.TotalAmount += amount
}
func (c *Children) GetTotalAmount() int {
    return c.TotalAmount
}
type Adult struct {
    Children
    HasOrderedAlcohol bool
}
func (a *Adult) OrderAlCohol(amount int) {
    a.TotalAmount += amount
    a.HasOrderedAlcohol = true
}
func (a *Adult) OrderSoftdrink(amount int) {
    a.TotalAmount += amount
}
func (a *Adult) OrderFood(amount int) {
    if a.HasOrderedAlcohol {
        a.TotalAmount += amount - 200
    } else {
        a.TotalAmount += amount
    }
}
func main(){
    var n, k int
    fmt.Scan(&n, &k)
    var c []Customer
    for i := 0; i < n; i++ {
        var age int
        fmt.Scan(&age)
        if age >= 20 {
            c = append(c, &Adult{
                Children: Children{TotalAmount: 0},
                HasOrderedAlcohol: false,
            })
        } else {
            c = append(c, &Children{TotalAmount: 0})
        }
    }
    for i := 0; i < k; i++ {
        var s, amount int
        var o string
        fmt.Scan(&s, &o, &amount)
        if o == "alcohol" {
            c[s - 1].OrderAlCohol(amount)
        } else if o == "softdrink" {
            c[s - 1].OrderSoftdrink(amount)
        } else if o == "food" {
            c[s - 1].OrderFood(amount)
        }
    }
    for i := 0; i < n; i++ {
        fmt.Println(c[i].GetTotalAmount())
    }
}

Goの場合継承が通じないのでインターフェースを定義することで解決しました。

まぁきれいには実装できましたね。

ということで今回はこれで👍