go实现面向对象编程
目录
一.面向对象编程的四大特性
二.代码讲解
实现抽象代码:
实现封装代码:
继承代码讲解:
继承:
组合:
实现多态代码:
一.面向对象编程的四大特性
抽象,封装,继承,多态
抽象:把一类事物的共有的属性(字段)和行为方法)提取出来,形成一个物理模型(结构体)。这种研究问题的方法称为抽象。(可以使用结构体完成抽象)
封装:也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
封装的实现步骤:
1)将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似private
2)给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数
3)提供一个首字母大写的Set 方法(类似其它语言的public),用于对属性判断并赋值
4)提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值
继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
(1)通过继承创建的新类称为“子类”或“派生类”。
(2)被继承的类称为“基类”、“父类”或“超类”。
(3)多级(结构体)继承,即为组合
要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
多态:是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。实现多态(使用接口与结构体进行实现多态)
二.代码讲解
实现抽象代码:
type Phone struct {name string
}type Camera struct {name string
}
//USB接口 Phone的实现
func (p Phone) start() {fmt.Printf("%s手机已经插入数据线,可以开始使用\n", p.name)
}func (p Phone) stop() {fmt.Printf("%s手机已经退出手机USB连接,暂停使用\n", p.name)
}//USB接口 Camera的实现
func (c Camera) start() {fmt.Printf("%s相机已经插入数据线,可以开始使用\n", c.name)
}
func (c Camera) stop() {fmt.Printf("%s相机已经退出手机USB连接,暂停使用\n", c.name)
}
通过定义结构体,然后各定义了它们的字段,方法。从而实现了类的抽象
实现封装代码:
type Cat struct {//将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似privatename stringage int
}//给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数
func NewCat(name string, age int) *Cat {return &Cat{name,age,}
}//提供一个首字母大写的SetMsg 方法(类似其它语言的public),用于对属性判断并赋值
func (c *Cat) SetMsg(name string, age int) {if age < 100 {c.name = namec.age = age} else {fmt.Println("这年龄太大了活不那么久")}
}//提供一个首字母大写的Getmsg 方法(类似其它语言的public),用于对属性判断并赋值
func (c *Cat) GetMsg() (string, int) {return c.name, c.age
}
func (c *Cat) Shout() {fmt.Printf("Hi, I am %s, aged %d, 喵喵喵\n", c.name, c.age)
}
1)将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似private
由上可看出,字段没有进行大写,所以无法被外部包访问,模拟了private
2)给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数
3)提供一个首字母大写的Set 方法(类似其它语言的public),用于对属性判断并赋值
这里创建了SetMsg方法进行对未导出字段进行修改赋值,模拟了其他语言的public状 态下的字段进行引用赋值
4)提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值
这里创建了GetMsg方法进行对未导出字段进行查看其字段值,模拟了其他语言的public状 态下的字段进行输出查看值
继承代码讲解:
要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
继承:
type Phone struct {name string
}//ColorPhone继承了Phone的特性(所定义好的各种字段信息)。还带有了自己独特的风格(除了拥有Phone的字段信息,还有自己专属的字段信息)type ColorPhone struct {Phone //被继承(嵌套)的结构体color string
}//以下是继承的实现 (提供了三个方法 init初始化对象信息 ,start和stop)
func (p *ColorPhone) set(name, color string) {p.name = namep.color = color
}func (p *ColorPhone) start() {fmt.Printf("%s%s的手机已经连接USB,开始工作\n", p.color, p.name)p.Phone.start()
}
func (p *ColorPhone) stop() {fmt.Printf("%s%s的手机已经退出连接USB,停止工作\n", p.color, p.name)p.Phone.start()
}
这里的 ColorPhone 结构体继承(嵌套)了Phone结构体,则ColorPhone具有了Phone结构体的字段以及方法,并且也具有自己的独特风格(属于自己的字段),这就实现了继承的效果
组合:
而假如多重嵌套结构体,则到了组合模式的概念。
type A struct {Name stringscore int
}type B struct {Name stringage int
}type C struct {A//嵌套的匿名结构体BName string
}
type D struct {xx C//有名结构体xxx B
}
这里则需要注意:
1.结构体可以使用嵌套匿名结构体所有的字段和方法,即 首字母大写或者小写的字段、方法,都可以使用。
var c Cc.A.Name = "kangkang"c.B.Name = "wangwang"c.Name = "liming"
2.结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时
结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,
否则编译报错,
type C2 struct {/*需要定义名字AA*/a1 Aa2 A
}
若两个相同的匿名结构体进行嵌套则需要进行声明名字,否则会报错
实现多态代码:
type USB interface {start()stop()
}type Phone struct {name string
}type Camera struct {name string
}
type Computer struct {
}//以下是 USB接口实现多态过程(一个接口多种不同状态的实现)
//USB接口 Phone的实现
func (p Phone) start() {fmt.Printf("%s手机已经插入数据线,可以开始使用\n", p.name)
}func (p Phone) stop() {fmt.Printf("%s手机已经退出手机USB连接,暂停使用\n", p.name)
}//USB接口 Camera的实现
func (c Camera) start() {fmt.Printf("%s相机已经插入数据线,可以开始使用\n", c.name)
}
func (c Camera) stop() {fmt.Printf("%s相机已经退出手机USB连接,暂停使用\n", c.name)
}//接口体现多态的两种方式: 1.多态参数 2.多态数组
//多态参数
func (computer Computer) Working(usb USB) {usb.start()usb.stop()
}func main(){//多态数组
usbArr := [...]USB{phone, camera}for _, v := range usbArr {computer.Working(v)//遍历出的哪个类型,就哪个类型实现多态
}
首先我认为是可以使用接口和结构体的内容来实现Java中的多态,而接口当做是父类,结构体当做子类当一个结构体或者多个结构体实现了接口中的所有方法时,就实现了这个接口,也就是说满足上面的 条件,子类(结构体)就继承了父类(接口),当多个结构体都继承了父类接口时,因为各个结构体的类型不同(例如:接口定义了“叫”这个方法,而“猫”结构体,“狗”结构体等等都实现了这个方法,但他们的类型属性不同。)所以这个接口就实现了多态
go实现面向对象编程相关推荐
- 【面向对象编程】(4) 类的继承,重构父类中的方法
各位同学好,今天和大家分享一下面向对象编程中,类的三大特征之继承.主要介绍:子类继承父类的基本方法:重写父类的类方法:重构父类的初始化方法:super() 方法.本节主要是单继承,多继承在下一节中介绍 ...
- 【面向对象编程】(3) 类之间的交互,依赖关系,关联关系
各位同学好,今天和大家分享一下面向对象编程中,类之间的交互,类之间的依赖关系和关联关系.有不明白的可见前一章节:https://blog.csdn.net/dgvv4/article/details/ ...
- 【面向对象编程】(1) 类实例化的基本方法
各位同学好,本章节和大家分享一下面向对象编程的一些方法,通过一些案例带大家由浅入深掌握面向对象的编程. 1. 最基本的类实例化 创建类的方法是 class 变量名: ,实例化方法是 类名() ,分配属 ...
- C#编程概念系列(一):面向对象编程
系列文章索引目录:http://www.cnblogs.com/loner/archive/2013/05/09/3068211.html 引子: 面向对象编程:这个在当下已不是什么时髦的概念,但通过 ...
- JavaScript面向对象编程
自从有了Ajax这个概念,JavaScript作为Ajax的利器,其作用一路飙升.JavaScript最基本的使用,以及语法.浏览器对象等等东东在这里就不累赘了.把主要篇幅放在如何实现JavaScri ...
- python面向对象的优点_Python面向对象编程——总结面向对象的优点
Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...
- 转载知乎上的一篇:“ 面向对象编程的弊端是什么?”
2019独角兽企业重金招聘Python工程师标准>>> 弊端是,没有人还记得面向对象原本要解决的问题是什么. 1.面向对象原本要解决什么(或者说有什么优良特性) 似乎很简单,但实际又 ...
- c语言面向对象编程中的类_C ++中的面向对象编程
c语言面向对象编程中的类 Object oriented programming, OOP for short, aims to implement real world entities like ...
- ruby 新建对象_Ruby面向对象编程的简介
ruby 新建对象 by Saul Costa 由Saul Costa Object-oriented programming (OOP) is a programming paradigm orga ...
- 面向对象编程概念_如何向6岁的孩子解释面向对象的编程概念
面向对象编程概念 by Alexander Petkov 通过亚历山大·佩特科夫(Alexander Petkov) Have you noticed how the same cliche ques ...
最新文章
- JavaScript规范
- 如何预防淋巴癌?(希望分享给更多的人看)
- 用 Freemarker 生成 word 文档
- keepalived实现haproxy高可用详解
- Android之如何成为Android高手
- CSS3的transition和transform
- 关于流(文件)的输入,输出与调用(fprintf,fscanf)
- 科学绘图与数据分析软件SigmaPlot
- 十大开源游戏引擎深入比较
- 你一生要知道的74幅世界名画…
- 单片机学习(三)中断
- 通过bitset库实现sha256
- MySQL数据库存储的字符显示是问号??
- 论文笔记 Weakly Supervised Deep Detection Networks - CVPR 2016
- idea各种中文乱码问题
- php调用大漠,大漠路人 - SegmentFault 思否
- 【Java开发】Java实现调用微信机器人,发送企业微信通知
- 可!!Win10禁用驱动程序强制签名
- Kali Linux 2020.1a 下载及安装(超详细)
- python获取gps数据_Python GPS模块:读取最新的GPS数据