go语言学习笔记——面向对象”继承“

205 阅读1分钟

继承是面向对象的一个重要特性之一,但是针对go语言来说,并不支持严格意义上的继承方法,以下使用PHP和go进行对比

PHP实现继承

<?php

class Pet
{
    public function speak()
    {
        echo "....\n";
    }

    public function speakTo(string $name)
    {
        $this->speak();
        echo $name;
    }
}

class  Dog extends Pet
{
    public function speak()
    {
        echo "Wang!\n";
    }
}

function main()
{
    $dog = new Dog();
    $dog->speak();
    $dog->speakTo("肥龙");
}

main();

此时,运行PHP代码,会输出

Wang!
Wang!
肥龙

因为Dog继承了Pet的方法speakTo和重写了speak方法

go实现”继承“

package main

import (
	"fmt"
)

type Pet struct {
}


func (p *Pet) Speak() {
	fmt.Println("...")
}

func (p *Pet) SpeakTo(name string) {
	p.Speak()
	fmt.Println(name)
}

type Dog struct {
	Pet
}

func (d *Dog) Speak() {
	fmt.Println("Wang!")
}

func main() {
	d := new(Dog)
	d.Speak()
	d.SpeakTo("肥龙")
}

输出结果

Wang!
...
肥龙

可以看出,Dog貌似是”继承“了Speak的方法,但是实际上在执行SpeakTo的时候,最终执行的还是Pet里面的SpeakTo的逻辑,所以Go其实并不支持面向对象的继承,而只是”伪继承“