go语言:面向对象的三大特性

一、封装(encapsulation)

封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作。

1、封装的理解和好处

(1)隐藏实现细节

(2)可以对数据进行验证,保证安全合理

2、如何体现封装

(1)对结构体中的属性进行封装

(2)通过方法、包实现封装

3、封装的实现步骤

(1)将结构体、字段(属性)的首字母小写(不能导出了,其他包不能使用,类似private)。

(2)给结构体所在包提供一个工厂模式的函数,首字母大写,类似一个构造函数。

(3)提供一个首字母大写的Set方法(类似其他语言的public),用于对属性判断并赋值。

func (var 结构体类型名) SetXxx (参数列表) (返回值列表) {

    //加入数据验证的业务逻辑

    var.字段 = 参数

}

(4)提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值。

func (var 结构体类型名) GetXxx() {

    return var.字段

}

4、快速入门案例

要求:设计一个程序,不能随便查看人的年龄工资等隐私,并对输入的年龄进行合理的验证

设计:model包(person.go),main包(main.go调用Person结构体)


model结构体声明
model封装

下面是main.go中的内容:

main

输出为:

输出

该实例中封装的特性自行体会。


二、继承(inherit)

1、继承的优点

继承可以解决代码复用,让我们的编程更加靠近人类思维。

当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体(比如刚才的Student),在该结构体重定义这些相同的属性和方法。

其他结构体不需要重新定义这些属性和方法,只需要嵌套一个Student匿名结构体即可。

也就是说:在Go语言中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问结构体的字段和方法,从而实现了继承性。

基本语法如下:

嵌套匿名结构体的基本语法

2、继承的深入讨论

(1)结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或小写的字段、方法,都可以使用。

(2)匿名结构体字段访问可以简化,如图:

调用简化

(3)当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分。

(4)结构体中嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体的名字,否则编译报错。

示例

C继承了A和B,然后A和B中都包含有Name字段,编译器无法识别所以会报错。用的时候需要指定是哪个父类的字段,修改后如下:

c.A.Name

这样运行就没问题了。

(5)如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体字段或方式时,就必须带上结构体的名字。

如下图定义了一个有名结构体,关键代码是"a A",匿名结构体的代码是"A"

有名结构体定义

有名结构体直接调用会出错

调用出错

必须指明继承的父类对象,才能正常调用:

修正后的代码

(6)嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值。

如下:

结构体声明
结构体定义

(7)结构体的匿名字段是基本数据类型,如何访问?

如下图:

匿名字段是基本数据类型
匿名字段是基本数据类型时的使用

说明:如果一个结构体中已经有一个"int"类型的匿名字段,就不能有第二个了。如果需要有多个int类型的字段,就不能用匿名了,必须是有名字段

3、多重继承

(1)概念定义

多重继承:如一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。

多重继承示意

TV既可以使用Goods中的属性和方法,也可以使用Brand中的属性和方法。

(2)多重继承细节说明

1)如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分。

比如上述代码中,Goods和Brands中有相同的字段Name,TV的实例对象tv如果想要去访问的话,必须用

tv.Goods.Name     或者     tv.Brands.Name

来访问。

2)为了保证代码整洁性,建议大家尽量不使用多重继承


三、多态(polymorphism)

1、接口(interface)

Golang中,多态特性主要是考接口来实现的。

(1)基本介绍

interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。到某个自定义类型(比如结构体Phone)要使用的时候,再根据具体情况把这些方法写出来。基本语法如下:

接口基本语法

(2)小结说明

1)接口里的所有方法都没有方法体,及接口的方法都是没有实现的方法。接口体现了程序设计的多态和高内聚低耦合的思想。

2)Golang中的接口,不需要显式地实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,Golang中没有implement这样的关键字

(3)注意事项和细节说明

1)接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)。

示例

2)接口中所有的方法都没有方法体,即都是没有实现的方法。

3)在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。

4)一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型。

5)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。

6)一个自定义类型可以实现多个接口。

7)Golang接口中不能有任何变量。

8)一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果是要实现A接口,也必须将B,C接口的方法也全部实现。

示例
示例

实现接口函数的时候,也不用指定是哪个接口的函数,直接实现就好。

9)interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil。

10)空接口interface{}没有任何方法,所以所有类型都实现了空接口。即我们可以把任何一个变量赋给空接口类型。

空接口

(3)接口vs继承

1)接口和继承解决的问题不同

继承的价值主要在于:解决代码的复用性和可维护性

接口的价值主要在于设计:设计好各种规范(方法),让其他自定义类型去实现这些方法。

2)接口比继承更加灵活

继承是满足“is a”的关系,而接口只需满足“like a”的关系。

3)接口在一定程度上实现代码解耦

Golang中,接口是一种松散性的实现方法,并不需要实现哪一个的接口,只需要提出方法就可以了。


2、多态(polymorphism)

多态是面向对象的第三大特征,在Golang中,多态特征是通过接口实现的。可以通过统一的接口来调用不同的实现。这时接口变量就呈现不同的形态。

接口体现多态的两种形式

1)多态参数

参考Usb接口的案例,Usb接口既可以接收手机变量,又可以接收相机变量,就体现了Usb接口的多态

2)多态数组

演示案例:给Usb数组中,存放Phone结构体和Camera结构体变量,Phone还有一个特有的方法call(),请遍历Usb数组,如果是Phone变量,除了调用Usb接口声明的方法外,还需要调用Phone特有方法call()。

演示案例
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容