我知道Go并没有这样的OO概念,但是让我借用它们只是为了让它更容易解释。
OO inherits允许使用类和它的子类将行为概括为更抽象的类型或类,其中子类继承父类的所有成员字段和行为。 Go没有这样的概念,但can achieve the same paradigm,其中文章解释了Go中的继承和子类化。
我的问题更多的是关于作业。假设我有一个"基类"车辆和"继承课程"汽车,如下:
type Vehicle struct {
wheelCount int
}
type Car struct {
Vehicle //anonymous field Vehicle
Maker string
}
在真正的OO中,我可以将Vehicle对象分配到Car对象中,但我还没有找到在Go中执行此操作的方法。所以我的问题是,
c := Car{Vehicle{4}, "Ford"}
,但是如果我在Car中有其他成员字段,比如Module等,我只想从Vehicle初始化成员字段,没有别的? 我为你准备了一些东西, http://play.golang.org/p/dcs9r7vPjZ
由于
答案 0 :(得分:2)
我可以将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}
}