inheritance - 从基类分配到 Go 中的继承类

标签 inheritance go variable-assignment member

我知道 Go 没有这样的 OO 概念,但让我借用它们只是为了更容易解释。

OO 继承允许将行为概括为更抽象的类型或类,使用类及其子类,其中子类继承父类的所有成员字段和行为。 Go 没有这样的概念,但是 can achieve the same paradigm ,其中文章解释了 Go 中的继承和子类化。

我的问题更多是关于作业。假设我有一个“基类”Vehicle 和一个“继承类”Car,如下所示:

type Vehicle struct {
    wheelCount int
}

type Car struct {
    Vehicle //anonymous field Vehicle
    Maker   string
}

在真正的 OO 中,我可以将 Vehicle 对象分配给 Car 对象,但我还没有找到在 Go 中执行此操作的方法。所以我的问题是,

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

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

谢谢

最佳答案

I can assign a Vehicle object into a Car object

你是说反面吗?在 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}
}

关于inheritance - 从基类分配到 Go 中的继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31665810/

相关文章:

C++继承方法调用基类的方法而不是重载方法

go - 如何在 Go 中初始化大小为 N 的空 bytes.Buffer?

c++ - 使用来自文件的输入创建变量

c - int i :3 in variable assignment? 是什么意思

Java 函数中的数组赋值

JavaScript 继承 Object.create()?

java - 覆盖与隐藏 Java - 困惑

c++ - 在给定指向父类(super class)的指针的子类上调用方法

go - 如何创建在responseWriter.Write 上返回错误的http.ResponseWriter 模拟实例?

json - 解码不一致的 JSON