连载:面向对象葵花宝典:思想、技巧与实践(6) - 不要说你懂“类”

2024-09-04 04:18

本文主要是介绍连载:面向对象葵花宝典:思想、技巧与实践(6) - 不要说你懂“类”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

方以类聚,物以群分——《周易 易传》。 


类是面向对象领域里最基础的一个概念,也是面向对象分析和设计的基石。 

然而,如此重要的一个概念,竟然很难找到深入的说明,绝大部分介绍面向对象的书籍或者资料基本上都是这么解释的:“类是一组对象的抽象”,这个解释看起来清晰明了,但实际上犯了一个逻辑上的错误:以未明确的概念来解释待明确的概念,什么是对象,什么是抽象,我们都还不知道,你却用这个概念来解释类?那当然看不懂了。 

还有另外一个解释:类就是属性和方法的集合!甚至还会给出如下这样的样例:

Class Person{

Int  age;

String  name;

Void play();

}

这种解释深究一下,其实很容易发现其犯了本末倒置的错误:类是本,代码是末,只有清晰地掌握了类的概念,才能写出好的代码。否则,即使写出了代码,也是一堆烂代码。

 

那究竟何为类呢? 

其实,抛开面向对象,抛开程序开发,即使在我们的现实世界中,类也是无处不在的:

古语云: 物以类聚,人以群分,这里的“类”,其实和面向对象中的“类”的逻辑含义并无不同。

我们的生物学将生物分为动物、植物、微生物等种类,这里的“类”,和面向对象中的类概念也是一致的。 

因此,当我们在定义什么才是“类”的时候,其实完全不需要和面向对象扯上关系。简单来说,类就是一组相似事物的统称。 

这个定义看起来再简单不过了,但为了避免在实践过程中设计不合理的类,我们还要深挖背后的玄机,玄机在哪里呢?

 

玄机就在定义里面,我们来认真分析一下定义:

首先:请看“一组”,思考一下为什么是“一组”,不是“一个”?

其次:请看“相似”,思考一下为什么是“相似”,不是“相同”?

最后:请看“统称”,思考一下为什么是“统称”,不是“名称”? 

第一个玄机——“一组”:一组的玄机在于“多个“,单个事物无法成为类。

一个很简单的例子:“人“可以是一类,但“我”就不是一个类(那又是什么呢,请看后文分解?) 

第二个玄机——“相似”:相似的玄机在于“比较像,但不完全相同”。

还是“人”这个例子:奥巴马和克林顿都是美国总统,都是人,有很多相似的地方,但他们两个绝对不是完全相同的。 

第三个玄机——“统称”:统称的玄机在于“统”,也可以叫做“通称”,统称要能够概括这多个事物。

还是上一个例子:奥巴马和克林顿的统称可以为“人”、“男人”、“总统”,但不会统称为“奥巴马”,因为奥巴马是一个具体的人了。 

类的定义玄机我们已经基本解读,看起来已经比较清晰了,但不要高兴太早,还有一个更大的玄机:我们怎么划分类?

 

一个很简单的问题:你和我是一类么?

。。。应该是:)

再一个简单的问题:你和猪是一类么?

你肯定会跳起来:我怎么和猪是一类呢?

但我要说,我们和猪确实是一类,我们都是“哺乳动物“。

再一个简单的问题:你和松树是一类么?

这次你可能学乖了:也是一类,都是“生物“。

。。。。。。

到这里你可能已经迷惑了“到底我和什么是一类“?

这个问题引出了类最重要的一个玄机:“如何定义类“? 

其实答案就隐藏在我们前面的问题中:“只要有相似点的就是同一类“!

我和你都是一类,是因为我们都是“人“;

你和猪是一类,是因为都是“哺乳动物“;

你和树一类,是因为都是“生物“;

。。。。。。

 

但这样又引出另外一个问题:如果只要有相似点就是同一类,那么最后是不是只要用一个类“事物”或者“东西”就可以了呢,干嘛还用得着分那么多类么?

万法归一,所有的事物当然最后都可以归为一类(例如在Java中就有一个大一统的类Class),但这显然远远不能满足我们的要求,实际应用中我们肯定需要不同的、多种多样的类,那么具体如何操作呢? 

有一句广告词可以很好的概括:角度决定看法!

也就是说:站在你的观察角度,能够看到相似点就是同一类!

当你观察人时,我和你是一类,但你和猪就不是一类了;

当你观察动物时,我、你、猪都是一类,但树就不是了;

当你观察生物时,我、你、猪、树都是一类

。。。。。。。

所以最后我们总结一下如何划分类:站在你的观察角度,具有相似点的事物就是同一类

这篇关于连载:面向对象葵花宝典:思想、技巧与实践(6) - 不要说你懂“类”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134970

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI