繼承and多型範例 - skynocover/Wiki-for-GoLang GitHub Wiki

繼承及多型

package main

import (
    "fmt"
)

type animal interface {
    eat() //定義interface只要會吃就是動物
}

type person struct {
    name string
    food string
}

func (p *person) eat() { //完成animal interface 接口設定, person屬於animal
    fmt.Println("i like to eat " + p.food)
}
func (p *person) talk() {
    fmt.Println("my name is " + p.name)
}

type men struct {
    person //men 繼承person
}

func (m *men) talk() { //override talk
    fmt.Println("i am a man, my name is " + m.name)
}

type women struct {
    person //women繼承person
}

func (w *women) eat() { //oeverride eat
    fmt.Println("i like to eat " + w.food + " and drink coffee")
}

type cat struct {
    food string
}

func (c *cat) eat() { //完成animal interface 接口設定, cat屬於animal
    fmt.Println("i don't like mouse, i like to eat " + c.food)
}

func say(a animal) { //型態是animal,可以傳入person或cat
    a.eat()
}

func main() {
    p := person{"Bob", "meat"}
    w := women{person{"Ann", "cake"}}
    m:=men{}
    m.name="Tim"
    m.food = "meat"
    c := cat{food:"fish"}

    p.talk()
    w.talk()
    m.talk()

    say(&p)
    say(&w)
    say(&m)
    say(&c)
}

/*
my name is Bob
my name is Ann
i am a man, my name is Tim
i like to eat meat
i like to eat cake and drink coffee
i like to eat
i don't like mouse, i like to eat fish
*/