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

时间:2015-07-28 01:04:32

标签: inheritance go variable-assignment member

我知道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中执行此操作的方法。所以我的问题是,

  • 有可能吗?
  • 否则,Go的方式是写一个" Car"来自" Vehicle"的构造函数我知道规范的方式是c := Car{Vehicle{4}, "Ford"},但是如果我在Car中有其他成员字段,比如Module等,我只想从Vehicle初始化成员字段,没有别的?

我为你准备了一些东西, http://play.golang.org/p/dcs9r7vPjZ

由于

1 个答案:

答案 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}
}