Go 中从基类到继承类的赋值

我知道 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


30秒到达战场
浏览 649回答 1
1回答

萧十郎

我可以将 Vehicle 对象分配给 Car 对象你是说对面吗?在 OOP 中,您不能将 Vehicle 分配给 Car,但可以将 Car 或 Van 分配给 Vehicle。如果是这样,您当然可以在 Go 中执行此操作:var v Vehiclec := Car{Vehicle:Vehicle{1}}v = c.Vehiclefmt.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}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go