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

2024-09-04 04:18

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

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


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

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

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

Class Person{

Int  age;

String  name;

Void play();

}

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

 

那究竟何为类呢? 

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

 

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

。。。应该是:)

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

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

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

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

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

。。。。。。

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

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

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

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

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

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

。。。。。。

 

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

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

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

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

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

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

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

。。。。。。。

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

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



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

相关文章

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

Python中处理NaN值的技巧分享

《Python中处理NaN值的技巧分享》在数据科学和数据分析领域,NaN(NotaNumber)是一个常见的概念,它表示一个缺失或未定义的数值,在Python中,尤其是在使用pandas库处理数据时,... 目录NaN 值的来源和影响使用 pandas 的 isna()和 isnull()函数直接比较 Na