目录
一、Go的拓展与复用
1、Go是否支持继承呢?
先说结论:不支持。
2、探究 Go 是否支持继承
场景设定
我们设定一个父结构体 Pet(宠物),和子结构体 Dog(狗);
Pet 实现了 speak() 方法和 speakTo() 方法;
如果 Dog 能够继承 Pet 并重写了 speak() 方法,根据 LSP 的原则,那么输出结果应该是 Dog speak()方法的结果。
示意图
运行结果
package extension
import (
"fmt"
"testing"
)
//定义父级的数据结构(Pet)
type Pet struct {
}
//父级有一个speak()方法
func (pet * Pet) speak() {
fmt.Println("Pet的speak()方法")
}
//父级有还有一个speakTo()方法,它调用了父级的 speak() 方法
func (pet * Pet) speakTo() {
pet.speak()
fmt.Println("Pet的其它代码")
}
//定义子集的数据结构(Dog)
type Dog struct {
//Go 语言提供了一种匿名嵌套类型,可以直接声明父级的数据结构
Pet
}
//在Dog中重写了Pet的speak()方法
func (dog *Dog) speak() {
fmt.Println("Dog的speak()方法")
}
//测试 Go 是否支持继承
//根据 LSP 原则,调用父类中的方法,如果子类中重写了父类的方法,那么会自动调用子类中的同名函数。
//如果 Go 支持继承,那么此处的输出应该为Dog的speak()方法输出的结果。
//根据代码运行结果,我们得知 Go 不支持继承
func TestClient(t *testing.T) {
dog := new (Dog)
dog.speakTo()
//输出结果:
//Pet的speak()方法
//Pet的其它代码
}
重点:Go语言提供了一种匿名嵌套类型,可以在子结构体中直接声明父级的数据结构。
结论:Go不支持继承。
二、多肽
虽然 Go 对 interface 的实现和其它主要编程语言完全不同,但是并不影响 Go 对多肽的支持。
1、场景
有一个编程语言的接口 (Programmer),接口中有一个需要实现的方法 WriteHelloWorld()
分别用 Go 和 PHP 来实现这个 HelloWorld() 方法。
2、示意图
3、调试结果
package peptides import "testing" //Programmer 接口 type Programmer interface { WriteHelloWorld() string } //GoProgrammer结构体 type GoProgrammer struct { name string } //GoProgrammer 实现 WriteHelloWorld() 方法 func (goPro *GoProgrammer) WriteHelloWorld() string { return "Go print Hello World" } //PhpProgrammer 结构体 type PhpProgrammer struct { } //PhpProgrammer 实现 WriteHelloWorld() 方法 func (php *PhpProgrammer) WriteHelloWorld( ) string { return "PHP echo Hello World" } //如果Go支持多肽,那么 GoProgrammer 和 PhpProgrammer 会各自输出各自的结果 func TestClient(t *testing.T) { goPro := new (GoProgrammer) php := new (PhpProgrammer) //Go print Hello World t.Log(goPro.WriteHelloWorld()) //PHP echo Hello World t.Log(php.WriteHelloWorld()) }
结论:Go支持多肽。
注:这篇博文是我学习中的总结,如有转载请注明出处:
https://blog.csdn.net/DaiChuanrong/article/details/118095783
上一篇:Go面向对象-接口
下一篇:Go-错误处理