为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 648 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信