亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中從基類到繼承類的賦值

Go 中從基類到繼承類的賦值

Go
30秒到達戰場 2021-10-25 17:08:28
我知道 Go 沒有這樣的 OO 概念,但讓我借用它們只是為了更容易解釋。OO 繼承允許將行為概括為更抽象的類型或類,使用類及其子類,其中子類繼承父類的所有成員字段和行為。Go 沒有這樣的概念,但是可以實現相同的范式,其中文章解釋了 Go 中的繼承和子類化。我的問題更多是關于作業。假設我有一個“基類”Vehicle 和一個“繼承類”Car,如下所示:type Vehicle struct {    wheelCount int}type Car struct {    Vehicle //anonymous field Vehicle    Maker   string}在真正的 OO 中,我可以將一個 Vehicle 對象分配給一個 Car 對象,但是在 Go 中我還沒有找到一種方法來做到這一點。所以我的問題是,有可能這樣做嗎?否則,從“車輛”編寫“汽車”構造函數的 Go 方法是什么?我知道規范的方式是c := Car{Vehicle{4}, "Ford"},但是如果我在 Car 中有其他成員字段,例如 Module 等,并且我只想從 Vehicle 初始化成員字段,沒有別的怎么辦?我已經為你準備了一些東西, http://play.golang.org/p/dcs9r7vPjZ
查看完整描述

1 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

我可以將 Vehicle 對象分配給 Car 對象


你是說對面嗎?在 OOP 中,您不能將 Vehicle 分配給 Car,但可以將 Car 或 Van 分配給 Vehicle。


如果是這樣,您當然可以在 Go 中執行此操作:


var v Vehicle

c := Car{Vehicle:Vehicle{1}}

v = c.Vehicle

fmt.Println(v) // prints {1}

此示例還演示了您可以準確地初始化您想要的字段。但是,這種類型的對象構造非常有限,因此構造方法通常用于獲得類似構造函數的行為:


func CreateVehicle(wheels int) Vehicle {

    return Vehicle{wheels}

}


func CreateCar(wheels int, maker string) Car {

    return Car{CreateVehicle(wheels), maker}

}


func main() {

    var v Vehicle

    c := CreateCar(4, "Ford")

    v = c.Vehicle

    fmt.Println(v)

}

順便說一句,如果您通常使用引用類型,那么 Go 中的引用管理可能會很棘手。結構總是按值傳遞。要通過引用傳遞它,請使用&獲取引用并*指定 byref 參數。


所以,這行不通:


func (v Vehicle) SetNumberOfWeels(wheels int) {

    v.wheelCount = wheels

}


func main() {

    v := Vehicle{}

    v.SetNumberOfWeels(5)

    fmt.Println(v) // prints {0}

}

但這將:


func (v *Vehicle) SetNumberOfWeels(wheels int) {

    v.wheelCount = wheels

}


func main() {

    v := Vehicle{}

    v.SetNumberOfWeels(5)

    fmt.Println(v) // prints {5}

}


查看完整回答
反對 回復 2021-10-25
  • 1 回答
  • 0 關注
  • 682 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號