Golang 面向对象编程

[复制链接]
查看2023 | 回复0 | 2019-6-12 11:21:39 | 显示全部楼层 |阅读模式
go语言中,虽然没有明确提出面向对象的概念,但是基于已有的语法设计,我们也可以写出面向对象的代码。go语言中的面向对象是借助struct结构体实现的。值得一提的是,go语言中虽然没有class关键字来表示类,但却有interface来表示接口。

回顾结构体
  1. type Person struct {
  2.   name string
  3.   age int
  4. }

  5. person := Person{"mike",18}
  6. fmt.Println(person)
复制代码
以上代码用结构体类型表示了一个人,用面向对象的思维来理解,name和age是两个成员变量。那么,我们就应该思考,如何编写成员方法呢?
go语言是这样设计的:
  1. func (person *Person) showInfo() {
  2.     fmt.Printf("My name is %s , age is %d ",person.name,person.age)
  3. }

  4. func (person *Person) setAge(age int) {
  5.     person.age = age
  6. }

  7. person := Person{"mike",18}
  8. person.showInfo()
  9. person.setAge(20)
  10. fmt,Println(person)
复制代码
在关键字func和函数名之间加上一对小括号,写上与之关联的结构体类型的指针类型和变量名,推荐写成指针类型的原因是,函数传递的形参不是指针类型的话,无法覆盖实参。
实际上,此时,showInfo(),setAge()就可以叫做成员方法了。
继承其他面向对象的语言,是使用extends关键字来表示继承的,而go语言中继承的设计非常简单,不需要额外的关键字。
  1. type Student struct {
  2.   Person
  3.   id int
  4.   score int
  5. }

  6. func (student *Student) showInfo() {
  7.   fmt.Println("I am a student ...")
  8. }

  9. func (student *Student) read() {
  10.   fmt.Println("read book ...")
  11. }

  12. student := Student{Person{"jake",16},1001,99}
  13. student.showInfo()
  14. student.setAge(22)
  15. student.read()
复制代码
可以看到,在学生结构体中,我们使用到了Person作为匿名变量,意思就是,Student继承自Person。我们除了继承了成员变量和成员方法之外,还可以为学生结构体增加成员方法,重写成员方法。

多态
  1. package main

  2. import "fmt"

  3. type Human interface {
  4.     speak(language string)
  5. }

  6. type Chinese struct {

  7. }

  8. type American struct {

  9. }

  10. func (ch Chinese) speak(language string ) {
  11.   fmt.Printf("speck %s\n",language)
  12. }

  13. func (am American ) speak(language string ) {
  14.   fmt.Printf("speck %s\n",language)
  15. }

  16. func main() {
  17.     var ch Human
  18.     var am Human

  19.     ch = Chinese{}
  20.     am = American{}

  21.     ch.speak("Chinese")
  22.     am.speak("English")
  23. }
复制代码
面向接口编程,结构体中只要有和接口中定义的同名方法,就称该结构体是实现了哪个接口。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则