继承替代Go中的方法参数

时间:2017-07-27 08:17:17

标签: oop inheritance go

我明白Go没有继承权并且与作品有关。

这是我的小例子:

A

我真正想要的是什么:

type Car struct {
    XMLName xml.Name `xml:"response"`
    // some properties coming from a XML file
}

type Audi struct {
    Car
    // some more properties coming from a XML file
}

func UnmarshalFromXML(url string, car *Car) { /* fill the properties from the XML file */ }

但这不起作用,因为没有继承。但我需要结构来使用XML文件的unmarshal功能。

那该怎么办?

2 个答案:

答案 0 :(得分:3)

go中的继承与其他语言非常不同。当从父类型扩展的类型时,这两种类型保持不同。在您的情况下,解决方案是创建一个接口,并将接口作为参数传递给函数。看看下面的例子:

package main

import (
    "fmt"
)

// creating an interface
type Vehicle interface {
    Move()
}

type Car struct {
    Color string
    Brand string
}

// Car has method Move(), automatically stated implement Vehicle interface
func (c *Car) Move() {
    fmt.Print("Car is moving")
}

func(c *Car) Honk() {
    fmt.Print("Teeeet... Teet")
}

type Audi struct {
    EngineType string
    Car
}

// passing an interface
func UnmarshalFromXML(url string, v Vehicle) { 
    fmt.Print(v)
    v.Honk() 

}


func main() {
    var car = Car{Color:"Green"}
    var audi = Audi{}
    audi.Car = car
    audi.Brand = "Audi"
    audi.EngineType = "EC"

    UnmarshalFromXML("someURL", &audi)
}

https://play.golang.org/p/ZO4P_3fjmz

本文对gohttp://spf13.com/post/is-go-object-oriented/

中的OOP进行了很好的解释

答案 1 :(得分:1)

您可以尝试使用接口

    type Car interface {
       theCar()
    }

    type CarBase struct {
    }

    func (_ CarBase) theCar() {
    }

    type Audi struct {
      CarBase
    }

    func UnmarshalFromXML(url string, car Car)