zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Go面向对象设计

Go 设计 面向对象
2023-09-11 14:16:33 时间

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

~