“法天象而应四时”--茶话软件开发之“抽象”

抽象不仅仅是软件领域,在有灵性的生物中都有抽象;

抽象不仅仅是OO的,非OO语言也有抽象;

抽象的级别:

类级别的抽象--类、抽象类、接口;

方法、函数级别的抽象--泛型、委托、Lambda表达式;

组件级别的抽象--业务组件,数据访问组件,UI控件;

解决方案的抽象-设计模式;

系统级别的抽象--AOP,SOA

应用级别的抽象-应用框架;

1,物以类分,人以群聚--类,抽象类,接口的关系。

将事物分类(class),是我们认识世界的一种重要方式,也是一种重要的思维方式,所以把我们周围的对象(object)划分成一个个的类,将大类再

细分成小类,例如由分子到原子,由原子到电子。所以,“类”是“对象”的抽象,是我们认识世界的“一级抽象”。

某些类还可以再抽象吗?

当然可以,将类的某些共同特性进一步进行抽象就是抽象类(abstract class),我们举一个例子说明它们之间的关系:

类是可以被实例化的,例如

class 人

{

  string 名字;

}

现在有一个叫做张三的人,我们这样表示:

人 man=new 人();

man.名字="张三";

这里,“人”这个类被实例化成“张三”了。

我们现在向上寻找“人”归属与那一类,很自然,“人”类属于“动物”类,我们修改一下“人”类的定义,让它继承一个父类“动物”类:

class 人:动物

{

...

}

问题来了,我们可以用“动物”类实例化出“张三”来吗?我们逆向思维一下,说到张三,我们就可以直接的想到他是一个人,而不是先想到他是一个动物,

况且,说到动物,我们想到的是猫、狗、狮子老虎之类的东西,显然,我们不能用“动物”类实例化张三,我们说“动物”类是抽象的,它不是一个具体的类,所以我们的动物类应该这样定义:

abstract class 动物

{...}

现在我们来观察一下“动物”类具有哪些方法,直接用代码说明:

abstract class 动物

{

void 吃东西();

void 睡觉();

void 叫声();

}

class 狗:动物

{...}

class 猫:动物

{...}

这样我们的狗 dog 和 猫 cat它们都会吃东西,睡觉,并发出叫声了:

狗 dog=new 狗();

猫 cat=new 猫();

dog.叫声();//汪汪

cat.叫声();//咪咪

现在看起来都没有问题,看来我们的抽象类工作的很好,有一天问题来了,我们买了一只玩具狗,它也会“汪汪”,我们可以这么写吗?

class 玩具狗:动物

{...}

显然上面这样写是错误的,玩具狗不是动物,但它的“叫声”怎么处理呢?

现在,我们需要对抽象类进一步抽象了,我们只需要它原来的一部分东西,例如,我们只需要把动物抽象类中的“叫声”抽象成

一个接口,况且叫它“叫声接口”,对原有的代码进行以下改进:

interface 叫声接口

{

void 叫声();

}

class 动物:叫声接口

{...}

class 玩具狗:叫声接口

{...}

玩具狗 dog1=new 玩具狗();

dog1.叫声();

-------------

  • 非常好,我们的玩具狗正常工作了,没有和动物类混杂到一块去,我们来总结一下类、抽象类、接口的一些区别:
  • :是现实世界中“对象”的“直接”抽象;(请注意“直接”二字)
  • 抽象类:是对数个类的某些“共同概念”上面的抽象,它不是实际的,它有一些抽象的特性必须由它的子类去具体实现;(请注意“概念”二字)
  • 接口:是不相关的一组类中的某些特性的抽象,它约定了不同的类直接的某种联系,或者说“契约”;(请注意“不相关”的相对性)

================

到这里,我们完成了对我们世界的“初级抽象”,至于更高级的抽象,我们下篇再说。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

10个实用的但偏执的Java编程技术

在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常。因为,你知道的……任何事情有可能出错,没错,的确如此。 这...

35413
来自专栏漫漫深度学习路

tensorflow学习笔记(二十八):collection

tensorflow collection tensorflow的collection提供一个全局的存储机制,不会受到变量名生存空间的影响。一处保存,到处可取。...

3499
来自专栏about云

about云spark开发基础之Scala快餐

---- spark是用Scala语言来写的,因此学习Scala成为spark的基础。当然如果使用其它语言也是可以的。从性能上来讲,及代码简洁等方面,Scal...

3016
来自专栏阿杜的世界

《Java 8实战》阅读笔记(1)

给方法listFiles传递方法引用**File::isHidden**

994
来自专栏编程微刊

2018年各大互联网前端面试题二(滴滴打车)

3562
来自专栏微信公众号:Java团长

谈谈我对面向对象以及类与对象的理解

对于刚接触JAVA或者其他面向对象编程语言的朋友们来说,可能一开始都很难理解面向对象的概念以及类和对象的关系。笔者曾经带过一个短期培训班教授java入门基础,在...

1072
来自专栏贾老师の博客

浮点数存储格式

1243
来自专栏机器学习算法与Python学习

Python技巧 101:这17个骚操作你都Ok吗

Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短。在本文中,作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Pyt...

1024
来自专栏微信公众号:Java团长

谈谈我对面向对象以及类与对象的理解

对于刚接触JAVA或者其他面向对象编程语言的朋友们来说,可能一开始都很难理解面向对象的概念以及类和对象的关系。笔者曾经带过一个短期培训班教授java入门基础,在...

1153
来自专栏编程

C语言最难啃的三块硬骨头,你越过去了吗?

提到C语言很多初学者都觉得,学到中间就进行不下去了,因为碰到了几个硬骨头死活翻不过去,于是很多人给C语言下结论太难了,太靠近底层了,特别是那几块难啃的骨头,直接...

2268

扫码关注云+社区