JavaEE鸿蒙应用开发HTML&JS+前端Python+大数据开发人工智能开发电商视觉设计软件测试新媒体+短视频直播运营产品经理集成电路应用开发(含嵌入式)Linux云计算+运维开发C/C++拍摄剪辑+短视频制作PMP项目管理认证电商运营Go语言与区块链大数据PHP工程师Android+物联网iOS.NET

【Go语言与区块链】关于Go语言【面向对象】心得分享与多态理解问题求助

来源:黑马程序员

浏览37047人

2019.05.20

Go语言的面向对象,实际上并不是完全体的面向对象,因为Go语言中并没有完全的类的概念而是用了一种叫做struct的结构体充当类。

面向对象的基本思想,实际上是对一类事物共性的抽象,比如一类人,学生类,教师类,洗衣机类。
人类都有共同的属性和行为,对应到面向对象里来说,就可以抽象为属性和方法。
而面向对象的意义通俗点来说就是提高了代码本身的复用性,
比如我今天要洗衣服:先把脏衣服收集起来-->放洗衣液-->揉一揉-->搓一凑-->清水洗一洗-->甩干/拧干-->晾起来
而面向对象的洗衣服:先写一个洗衣机(放洗衣液-->揉一揉-->搓一凑-->清水洗一洗-->甩干/拧干)
          过程就变成了 :  先把脏衣服收集起来-->放进洗衣机-->晾起来
也许抽象一个洗衣机很麻烦,但是以后每次洗衣服我只需要复用这个洗衣机就好了。

这个思想在处理IO流操作的时候也十分受用:我做一个文件传输,把文件所有的传输过程都封装好,最后用的时候只需要自己输入目标文件的url就可以轻松实现所有的过程

我也试着了解了一些java的面向对象思想,他们会封装一类事物到一个.java文件下,来描述这样的类。
比如人类共同的特性就是有两个耳朵,一个鼻子,而进而创建一个学生类,学生类共同的行为就是上课,同时又是人类,这样我们就可以通过extends Person类的方式来继承人类的两个耳朵和一个鼻子,通过这样的方式来实现面向对象的一大特征:继承

而我使用学生方法的时候就可以Student stu = new Student();创建一个Student类的对象,就能调用其下的learn方法,如果这个学生类继承了Person类,你也可以调用Person类下的方法

而在Go语言中,把结构体struct充当类,通过创建一个该结构体类型的变量来创建对象stu1。也是通过stu1.属性的形式来调用该结构体下的属性,不同的是结构体是无法存方法的,因此使用写在结构体外的、绑定stu1的函数来描述student的方法,比如 :
type Student1 struct {
   name string
   age int
}
func (stu Student)Study{
  fmt.Println("这是stu的方法")
}
通过这样的方式来实现面向对象的形式我还是第一次见到的,以至于我在听课之后理解了很久,并查阅了文档。
而Go的继承更加的简单方便,只需要 在结构体内写上需要继承的结构体名就ok了,比如:
type Person struct{
  height int
  weight int
}
type Student1 struct {
   Person
   name string
   age int
}

这样就可以实现继承了。

关于多态的实现我放到最后说(以下话语如有不当,欢迎指正):
其实我对多态的理解仍然不是很深刻,因为Go的多态是通过接口来实现的,Go语言的接口是个神奇的类型,当你传入什么类型的参数时,接口就会变成什么类型。
Go语言的多态是通过 接口传入参数的类型 来通过 接口内的抽象方法 进而 实现接口下的方法。