实现接口和继承比较(2) | 学习笔记

简介: 快速学习实现接口和继承比较(2)

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程实现接口和继承比较(2)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9826


实现接口和继承比较(2)

 

内容介绍

一、接口和继承的关系举例说明

二、接口和继承的其他关系

 

一、接口和继承的关系举例说明

image.png

图示为一个比较经典的接口和继承的关系图,图中有两个结构体,其中运动员结构体被篮球运动员和足球运动员这两个结构体所继承,学生这个结构体被大学生和中学生这两个结构体所继承。现在我们有这样的需求,要求足球运动员和大学生掌握英语,有以下几种方式可以实现。第一种直接把学英语技能这个方法写在运动员结构体中,但会存在一个问题,如果写在运动员这个结构体里面,就意味着篮球运动员即使在不想学英语,不需要掌握这个英语技能的情况下,也会被动的接受这个技能,所以直接把这个方法写到运动员结构体中是不合理的,同样的道理,如果把学英语这个方法写在学生这个结构,中学生也被动的接受了学英语的技能,这样也是不合理的。因此利用继承的关系不太容易解决这种需求。但还有一种可能,就是直接把学英语技能的方法直接写在足球运动员上,那么足球运动员就可以去学英语了,同样在大学生这个地方也绑定一个方法,让他去学英语,这样就满足了足球运动员和大学生都可以学英语这个需求了。理论上这种方式是可以的,但在足球运动员结构体和在大学生结构体上分别添加一个学英语的方法,不足之处就是规范性不好。因为在写足球运动员和大学生学英语这个方法的时候,有可能规范就出现了偏差。由于我们希望项目是有规范性的,并不希望足球运动员和大学生学英语写入的方法不一样,比如说他的名字不一样或者是它的参数不一样。因此这个时候需要用接口来实现,这样就可以解决上述产生的问题。首先去定义一个接口,接口叫做学习英语的技能,在接口里面定义相关的方法,然后让足球运动员和大学生来实现这个接口就可以了。这样的好处第一个就是不会影响其他结构体,让足球运动员去实现这个接口,不会影响到篮球运动员,也不影响到运动员整体这个结构体,让大学生去实现这个接口,不会影响到中学生这个结构体,也不会影响到学生整体这个结构体;第二好处就是因为这个接口是已经定义好的,现在让足球运动员和大学生都来实现这个接口,规范性就得到了保证。接口的功能十分具有优势,第一个不破坏继承关系,第二个规范性能够得到保障,我们可以再次体会到接口就是对继承的一种补充,可能大家目前还没有大量去使用接口,因此没有感觉到它的妙用,但的的确确接口可以解决很多的问题。

 

二、接口和继承的其他关系

1、接口和继承解决的问题其实是不一样的。

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

继承真正的价值主要是解决代码的复用性和可维护性,继承是让一个结构体去继承另外一个结构体,结构体种重复的代码不需要再重复去写,复用性就可以解决;可维护性就是说让被继承的那一个结构体可以通过接口增加一个方法。其结构体也就相应的有了这些字段和方法,因此可维护性也提高了。

(2) 、接口的价值主要在于:设计

接口真正的价值主要在于设计,可以设计好各种规范,其实这些规范就是很多不同的方法,然后让其他自定义类型去实现这些方法即可。因此接口的价值更多的在于设计,尤其是在 golang 里。大家在学习接口的最佳实践案例的时候,应该可以感觉到接口的威力,因为它可以设计好很多规范,只要去实现这个接口就可以,所以这一点是真的很方便。

2、接口比继承更加的灵活

尤其是在 golang 里面,接口是一种很松散的实现机制,所以它比继承更加的灵活,更加方便。例如继承满足 is-a 的关系,比如有 person 和 student 两个结构体,两者之间是 is-a 的关系,即 student is a person。而接口满足 like a的关系,比如说前面写一个接口 BirdAble,还有一个结构体叫 Littlemonkey,我们不可以说猴子是一个鸟,但是可以说猴子可以像小鸟一样飞翔,即通过接口,可以让结构体的功能得到一个扩展。因此他们之间 like a 的关系要弱于is a 的关系。

3、接口在一定程度上可以实现代码解耦

在 golang 里面,接口是一种松散性的实现,并不需要去指定实现的是哪一个接口,只需要去实现这个方法就可以了。

在代码里进行体验,这里的 little monkey 实现了 flying 这个方法,但是并没有指定这个方法是哪一个接口里面的,其重点就是基于这个方法来实现这个接口,所以可以认为接口在一定程度上实现了代码的解耦,非常的灵活。

相关文章
|
6月前
|
Java
接口和抽象类的区别
接口和抽象类的区别
91 6
|
6月前
|
Java
抽象类和接口有什么区别?
抽象类和接口有什么区别?
|
2月前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
110 5
|
5月前
|
C++
【C++】学习笔记——继承_2
【C++】学习笔记——继承_2
33 1
|
5月前
|
程序员 编译器 C++
【C++】学习笔记——继承_1
【C++】学习笔记——继承_1
24 0
|
6月前
|
Java
抽象类和接口的区别
抽象类和接口的区别
83 0
|
6月前
|
测试技术 C++
C++零基础教程(抽象类和接口)
C++零基础教程(抽象类和接口)
51 0
|
SQL 关系型数据库 数据库连接
接口继承|学习笔记
快速学习接口继承,接口只能被类去实现,如果想要规范团队,也不能把所有想要规范的东西写在一个接口里,这样会使接口臃肿,不好实现接口的类,因为有可能并不需要这么多规范。为了使接口的体系更加完整,更加具有结构性,就有了接口继承。本节的目标是理解接口的继承体系,掌握具体的接口继承实现。
接口继承|学习笔记
|
PHP 开发者
下一篇
无影云桌面