如何在Go中为嵌入式方法提供struct方法的访问权限?

时间:2018-03-15 02:13:48

标签: inheritance go composition

在Python中使用继承

class Animal(object):
    def eat(self):
        print self.name + " is eating " + self.get_food_type()


class Dog(Animal):
    def __init__(self, name):
        self.name = name

    def get_food_type(self):
        return "dog food"

dog = Dog("Brian")
dog.eat()

# Expected output => "Brian is eating dog food"

更新:在上面的例子中,我的子类是从它的超类调用一个方法,而超类中的函数实际上是知道子类方法。我希望能够在Go中实现类似的效果。

我最接近继承的是在Go中嵌入struct。

type Animal struct {
    Name string
}

func (a *Animal) Eat() {
    fmt.Println(a.Name + " is eating " + a.GetFoodType())
}

type Dog struct {
    *Animal
}

func (d *Dog) GetFoodType() string {
    return "dog food"
}

func main() {
    dog := &Dog{&Animal{"Brian"}}
    dog.Eat()
}

# Error => type *Animal has no field or method GetFoodType

为之前的错误道歉,我意识到结构域确实更好地放入Animal结构中,因为所有动物共享属性名称。但是,我希望在嵌入Animal结构的不同结构中实现相同方法的不同实现。

1 个答案:

答案 0 :(得分:3)

设计你的Go程序以使用合成而不是继承。

在你的例子中,为什么你不希望Animal有一个名字?这将打印:"布莱恩正在吃#34;:

package main

import "fmt"

type Animal struct {
    Name    string
}

func (a *Animal) Eat() {
    fmt.Println(a.Name + " is eating")
}

type Dog struct {
    Animal
}

func main() {
    dog := &Dog{Animal{"Brian"}}
    dog.Eat()
}

你可能会在Go中找到有关成分的this related blog post