一文搞懂Go面向对象设计

举报
海风极客 发表于 2022/10/17 22:40:43 2022/10/17
【摘要】 1 什么是面向对象?如果有深入学习过Java的同学一定会知道,在Java中,“万物皆对象”,而对象又有各自的属性和方法,在Java中,对象按不同类型又可以分为实体类对象、业务类对象等等。面向对象是一种传统的软件开发方法,一种编程范式,他区别与面向过程的程序设计语言,我们来打个比方:针对事件:学生小明要去上学面向过程的解决方式:小明->起床->做校车->上学面向对象的解决方式:小明->去上学...

1 什么是面向对象?

如果有深入学习过Java的同学一定会知道,在Java中,“万物皆对象”,而对象又有各自的属性和方法,在Java中,对象按不同类型又可以分为实体类对象、业务类对象等等。

面向对象是一种传统的软件开发方法,一种编程范式,他区别与面向过程的程序设计语言,我们来打个比方:

针对事件:学生小明要去上学

面向过程的解决方式:小明->起床->做校车->上学

面向对象的解决方式:小明->去上学

因此,面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

2 面向对象的三大特点

这是一个非常老生常谈的问题,但是Java的初学者可能会有很大一部分人没有深入理解这三个特性

  • 封装:封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。

    比如Java中的private关键字和getter、setter方法就是一种封装,不可以单独访问对象的某个属性,而是把每个属性都放在对象来处理。

  • 继承:继承简单地说就是一种层次模型,这种层次模型能够被重用。

    继承会让人们想到父子关系,在Java面向对象的思想中也是如此,但不同的是在Java中子类拥有其父类的属性和方法,如果没有特殊关键字的约束,子类可以取代父类,并且一个父类能有多个子类。

  • 多态:多态是指不同事物在不同场景下具有不同表现形式的能力。

    多态的实际应用层面最多的就是接口和泛型,是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

3 Go语言面向对象设计

3.1 封装

type Student struct {
   Peo    People
   Sid    int
   School string
}

func (stu Student) getName() string {
   return stu.Peo.Name
}

//setter方法要使用指针类型,确保set的值是同一个对象
func (stu *Student) setName(name string) {
   stu.Peo.Name = name
}

3.2 继承

Go语言使用结构体嵌套来实现继承

type People struct {
	Id   int
	Name string
	Age  int
}

type Student struct {
   Peo    People
   Sid    int
   School string
}

3.3 多态

同一个接口可以用不同的对象来实现,进而产生不同的状态。

type HelloService interface {
   sayHello(name string)
}
type People struct {
   Id   int
   Name string
   Age  int
}

func (peo People) sayHello(name string) {
   fmt.Println("Hello " + name + ", I am " + peo.Name)
}
type Student struct {
   Peo    People
   Sid    int
   School string
}

func (stu Student) sayHello(name string) {
   fmt.Println("Hello " + name + ", I am " + stu.Peo.Name)
}

测试

import "fmt"

func main() {

   stu := Student{People{1, "zs", 12}, 1, "ZZJM"}
   stu.Peo.sayHello("Zs")

   stu.sayHello("Ls")

   fmt.Println(stu.getName())
   stu.setName("ww")
   fmt.Println(stu.getName())
}

结果:

Hello Zs, I am zs
Hello Ls, I am zs
zs
ww

~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。