Golang之繼承,多重繼承(struct)


熱乎的代碼來了

package main

import "fmt"

/*
繼承
一個結構體嵌到另一個結構體,稱作組合
匿名和組合的區別
如果一個struct嵌套了另一個匿名結構體,那么這個結構可以直接訪問匿名結構體的方法,從而實現繼承
如果一個struct嵌套了另一個【有名】的結構體,那么這個模式叫做組合
如果一個struct嵌套了多個匿名結構體,那么這個結構可以直接訪問多個匿名結構體的方法,從而實現多重繼承
*/

type Car struct {
    weight int
    name   string
}

func (p *Car) Run() {
    fmt.Println("running")
}

type Bike struct {
    Car
    lunzi int
}
type Train struct {
    Car
}

func (p *Train) String() string {
    str := fmt.Sprintf("name=[%s] weight=[%d]", p.name, p.weight)
    return str
}

func main() {
    var a Bike
    a.weight = 100
    a.name = "bike"
    a.lunzi = 2
    fmt.Println(a)
    a.Run()

    var b Train
    b.weight = 100
    b.name = "train"
    b.Run()
    fmt.Printf("%s", &b)
}

 練習2

package main

import (
    "fmt"
    "time"
)

type Car struct {
    Name string
    Age  int
}

func (c *Car) Set(name string, age int) {
    c.Name = name
    c.Age = age
}

type Car2 struct {
    Name string
}

//Go有匿名字段特性
type Train struct {
    Car
    Car2
    createTime time.Time
    //count int   正常寫法,Go的特性可以寫成
    int
}

//給Train加方法,t指定接受變量的名字,變量可以叫this,t,p
func (t *Train) Set(age int) {
    t.int = age
}

func main() {
    var train Train
    train.int = 300 //這里用的匿名字段寫法,給Age賦值
    //(&train).Set(1000)
    train.Car.Set("huas", 100 )
    train.Car.Name = "test" //這里Name必須得指定結構體
    fmt.Println(train)

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM