首先声明下go 没有继承,没有继承,没有继承,重要事情说三遍。但是他又能实现继承,通过一个神奇的东西 - 结构体。
那么抽象类的使用场景是什么呢?
定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能
说人话就是:规范了执行方法,想覆盖就重写,不想覆盖就用父类的就好了
在这些情况下,我们需要使用抽象类继承,来帮助我们写出更优雅的代码。可是在 golang 中又没有抽象类的概念,哪有如何呢?
那不得不介绍一种通过 struct 和 interface 来在 golang 中实现抽象类的方法。
因为go 里面没有extends
abstract
这些关键字,那么先从大家所熟悉的主流语言java
来引入一段代码
java实现抽象类
1.创建抽象父类
package abstractModel;
public abstract class CatAbstract {
public abstract void steeringWheel();
public void run(){
System.out.println("我是父类方法-run,大家一起跑起来~");
}
}
我创建了一个公共的方法run
或者换一种名字叫做默认方法
另外创建一个抽象方法steeringWheel
,子类都需要实现的
2.创建2个子类
第一个aodi的
package abstractModel;
public class Audi extends CatAbstract{
@Override
public void steeringWheel() {
System.out.println("我是奥迪的方向盘");
}
}
第二个benchi的
package abstractModel;
public class Benz extends CatAbstract{
@Override
public void steeringWheel() {
System.out.println("我是奔驰的方向盘");
}
@Override
public void run() {
System.out.println("我奔驰nb 有自己的方式跑起来");
}
}
运行如下
package abstractModel;
public class AbstractMain {
public static void main(String[] args) {
Audi audi = new Audi();
audi.steeringWheel();
audi.run();
System.out.println("-----华丽分界线----");
Benz benz = new Benz();
benz.steeringWheel();
benz.run();
}
}
只要重写了父类那么就用子类的,没实现就用父类的,抽象方法一定要在子类实现。
好了,现在咱们用go 来实现这段java代码
Go 实现抽象类
先来实现第一个父类
package abstractClass
import "fmt"
type CatAbstract struct {
ICatAbstract
}
type ICatAbstract interface {
SteeringWheel()
Run1()
}
func (c *CatAbstract) Run1() {
fmt.Println("我是父类方法-run,大家一起跑起来~")
}
创建一个interface
里面同样有2个方法。这2个方法放到这里,起子类可以都来实现它,假如有一个默认的方法run1
,那咱就默认把它给实现了,那么他就不是一个抽象方法了,其实go里面压根就没这个东西,咱们是为了实现它,而临时定义的名字叫做抽象方法,记住go里万物皆结构体,比php万物皆数据更强大(对go这种语言写设计模式代码,真的蛋疼)
创建2个子类
package abstractClass
import "fmt"
type Audi struct {
CatAbstract
}
func (a *Audi) SteeringWheel() {
fmt.Println("我是奥迪的方向盘")
}
定义的第一个类audi
咱们就实现一个”抽象方法“ SteeringWheel
在创建另一个benz
package abstractClass
import "fmt"
type Benz struct {
CatAbstract
}
func (b *Benz) SteeringWheel() {
fmt.Println("我是奔驰的方向盘")
}
func (b *Benz) Run1() {
fmt.Println("我奔驰nb 有自己的方式跑起来")
}
它就很聪明的实现了2个
看效果
package abstractClass
import (
"fmt"
"testing"
)
func TestAbstractClass(t *testing.T) {
audi := &Audi{}
audi.SteeringWheel()
audi.Run1()
fmt.Println("-----华丽分界线----")
benz := &Benz{}
benz.SteeringWheel()
benz.Run1()
}
到这里就结束了,go没有继承,万物皆结构体,请不要用其他语言的编程思想来写go,不然就是对自己的折磨。
请记住go没有继承,万物皆结构体
go 起来吧!