golang如何体现面向对象思想

Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现OOP特性的。

Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:Golang没有extends关键字,继承是通过匿名字段来实现的。

Golang面向对象编程非常简洁,去掉了传统OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指针等等。

Golang仅支持聚合和嵌入,提倡面向接口编程。

Golang的封装通过struct(结构体)实现,继承通过匿名字段实现,多态通过interface(接口)实现

封装

在Java里面,我们使用public,private,protected关键字来作为变量或者函数的权限设置,但在Go语言中,GO语言只有大小写的区别,如果想把函数或者变量暴露在外部,那么就首字母大写,相反则小写。

继承(匿名字段+匿名函数)

匿名字段实现了成员变量的继承。

type Person struct {
    Name string
    Age int
    Gender string
} 

type Student struct {
    Person //通过匿名组合方式嵌入了Person属性
    Score float64
}

 在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。

package main

import "math"
import "fmt"

type Point struct {
    x float64
    y float64
}

func TraDistance(p1 Point, p2 Point) float64 {
    return math.Hypot(p1.x-p2.x, p1.y-p2.y)
}
func (p1 Point) ObjDistance(p2 Point) float64 {
    return math.Hypot(p1.x-p2.x, p1.y-p2.y)
}
func main() {
    p1 := Point{10, 20}
    p2 := Point{20, 10}
    old_len := TraDistance(p1, p2)
    new_len := p1.ObjDistance(p2)
    fmt.Println("The result of old method is ", old_len)
    fmt.Println("The result of OBJ method is ", new_len)
}

多态(interface)

特点

1. interface 是⽅法声明的集合

2. 任何类型的对象实现了在interface 接⼝中声明的全部⽅法, 则表明该类型实现了该接⼝。

3. interface 可以作为⼀种数据类型, 实现了该接⼝的任何对象都可以给对应的接⼝类型变量赋值

注意

a. interface 可以被任意对象实现,⼀个类型/对象也可以实现多个 interface  

b. ⽅法不能重载,如 eat(), eat(s string) 不能同时存在

interface⼀定要和多态的特性结合

多态的三要素

1 有⼀个⽗类的接⼝(抽象)

2 有⼦类重写⽗类的全部接⼝⽅ 法

3 ⽗类(接⼝类型) 指针/引⽤ 指 向⼦类对象

⼀旦有interface出现 ,⼀定要针对interface去写业 务

多态具有架构思想和调⽤未来代码的意义

⾯向对象的开闭原则

给⼀个类添加⼀个新的功能,不需要修改该类,⽽是通过额外的 添加代码来实现,保证了之前原有系统的安全性

⾯向对象的依赖倒转原则

抽象层

先设计抽象层接⼝,实现⼀个⼀个的interface

设计难度较⼤,不要轻易修改

实现层

⾯向抽象层 是实现具体的类,将接⼝全部实现

业务逻辑层

⾯向抽象层,去编织业务逻辑

总结:接⼝的意义 多态的思想 调⽤未来

原文地址:https://www.cnblogs.com/peteremperor/p/13706226.html