Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)

引言

在OO的工作中,我们一定会涉及到类,抽象类和接口。那么类和抽象类以及接口到底扮演的什么角色?

本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概念,快速理解他们的区别与联系?

如果大家觉得还有必要把这块更新的更好,还请多多反馈。

如果觉的对您有用还请点击 “推荐”下,我会持续更新更多新的内容。

古老的传说

相传盘古开天劈地后,女娲一天在黄河边梳头时,突发奇想以泥土仿照自己抟土造人,创造并构建人类社会。后来又替人类立下了婚姻制度,经过一代又一代的繁衍生息,创造今天伟大的文明社会。

OO的诞生,虽然没有“女娲造人”这么传奇,但OOP是软件开发历程又一重要历程碑。并且它的诞生和“女娲造人”有着极其类似的思想(或者说如出一辙)。

下图所示变成语言发展简史:

回到本文的主题来!

对照人类社会的诞生传奇史,我个人认为这两个社会有着极其类似的社会元素和运作规律,请看下表:

人类社会 OO的社会
人(抽象的人) Class
父母的角色 Abstract
职位或者岗位 Interface

具体怎么理解?让我们慢慢道来。

类(Class)

类和“女娲造人“中的人有着极其类似的相似,他们都是社会中的基本单元。社会中的一切活动最后都是有这些基本单元来完成的,当然这些基本单元又有自己的一些特性。

私有空间 private

每个人自己私有)

类,作为OO社会的一员,为了完成各种功能。我们也都提供了一些必要的公开的(public)的属性和行为(字段不提倡公开)。

远亲不如近邻 internal

”远亲不如近邻“有生活阅历的人,一定深深懂得这句老话。

OO社会也是这个里。 如果一个类中定义一个(internal)的属性和方法,那么这些方法可以被在与其无父子关系的类中直接调用。(当然实例方法要通过实例来调用)

接口(Interface)

既然我们是人类社会中的一个普通人不是生活在武侠小说里的”大侠“,所以你为了养家糊口还必须找个差事。

差事有分为了好多类,每类差事就是一个工作岗位如“销售经理”,岗位职责定义了一系列岗位工作内容,同时他也可能始终权利的载体。赋予了“销售经理”这个职位的人就有了管理销售的职责和权利。

OO的社会中也一样,Interface就像一个岗位。同样定义了一些工作内容和权利(属性和字段),类通过继承接口来让自己满足该岗位的需求。因为岗位本身没有生命所以Interface自己不能被实例,只能创建继承了该接口的类。

为啥职责要毫无保留的公开?

既然 岗位职责所以你所有的内容都应该是公开(public)的,并且是毫无隐私的,没有一丁点灰色地带。因为既然你作为一个管理层且作为一个部门的接口人,那你的资源和职责首先得公告天下。藏着掩着别人就无法在遇到问题是找到合适管理层接口人去解决相应的问题。

为啥职位不能有私有空间?

既然是管理层那么难免会出现“权利寻租”的情形,在追求廉洁公正的社会里,就不应该让这种思想作恶。

所以在OO的世界里如果你是按职位去调用类的话,你的权利是被锁在笼子里的,OO内部机制会把具体的类先转换成接口类型,然后再执行接口内的的公共属性和方法。

高薪养廉

大家都知道,既然有“经理”的头衔,那么你的薪酬中自然会多出一块岗位薪金,用于支付你所在岗位付出的辛劳。

OO社会中也一样如果某个类 A 实现接口 IA

?


1

2

3

4

5

6

7

8

9

10

11

Interface IA{void Execute();}

 

Class A:IA { void Execute(){…};}

 

Class Program

 

{

 

A a1=new A();

 

IA a2=new A();

?


1

a2.Execute();//

付出的代价更高,需要类似转换

?


1

2

a1.Execute();

}

抽象类(Absctract)

“世界上最关心你的人是你的父母”-抽象类就像父母这个角色。不论是富二代,还是穷二代,父母都会不遗余力的帮助孩子。给你一定财富(property)同时还替你包办了一些工作,但他们再对孩子亲也有父母自己的私人空间。

私人空间 private

最亲近的人也有各自的私有空间。

OO社会也一样,子类不能访问到父类的私有(private)成员和方法。

孩子自己必须有自立根生 abstract

父母对你再好也不能替孩子吃喝拉撒,这些事情必须亲历亲为。

OO社会中,父类通过定义抽象的(abstract)的属性或者方法,来强制子类必须实现某些属性和行为。

父母情愿包办 protected

父母是永远都是孩子最坚强的后盾。你上学父母给你送钱送粮还虚寒温暖,你结婚父母还在

因为在父母的眼里,孩子永远都是孩子,虽然他们已经有了自己的小家还有了自己的孩子。

OO社会中抽象类会有一些家族保护(protected)的属性和方法供子类直接使用。

父母更希望“青出于蓝而胜于蓝”virtual

有时候父母还觉的我们年轻,总想替我们做些事情。但他们更希望孩子自己去做必要的时候再来找父母帮忙。

OO中的Virtrual就是这样的。父类中的Virtual方法大部分的时候都会提供一些实现,如果子类没有特殊情况可以直接使用父类的方法,但如果子类的方法有特殊处理可以覆盖(override)掉父类方法,当然也可以通过base来调用父类同名的方法。

C++中的“乱伦”

C++中允许多继承。在语言设计的初期绝对只是考虑到了代码重用,但却不经意间造成这种”乱伦“情况。

所以学习和使用C++时我们还是尽量避免这种多继承的出现。让我们的代码更好维护。

回顾下OO中定义

“唯我独尊,舍我其谁”--Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的。

面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是(Class)的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

类(Class)定义了一件事物的抽象特点。通常来说,定义了事物的属性和它可以做到的(它的行为)。类有以下三个基本特性:

  1. 封装。
  2. 继承。
  3. 多态。

接口

接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。

接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。

抽象类

抽象类对多个相似类的再次抽象,实现代码复用或者实现依赖注入。

接口与抽象类的异同

相同点:

1.他们都不能实例化自己,也就是说都是用来被继承的。

2.抽象类中的抽象方法和接口方法一样,都不能有方法体

不同点:

1.抽象类里可以有字段,接口中不能有字段.

2.抽象类中的普通方法可以有方法体,而接口方法没有方法体。

3.接口中的方法不能有访问修饰符,抽象类中的抽象方法被继承,需要override重写 .

4.接口更像是一种规范,一种约束。

5.一个子类只能继承一个抽象类,但却可以继承多个接口。

接下来是抽象方法和虚方法的异同:

其实可以把抽象方法看做是没有方法体的虚方法。

相同点:

1.抽象方法和虚方法都可以被重写。

不同点

1.abstract 和virtual的关键字不同

2.抽象方法一定没有方法体,而虚方法可以有方法体。

参考

女娲造人

面向对象程序设计

http://www.cnblogs.com/HQFZ/p/4714686.html

时间: 2024-10-21 04:54:33

Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)的相关文章

软件的重用性的高低就取决于它的耦合程度的高低

一个软件,它具有许多类,类与类之间需要互相调用,一旦某个类与另一个类具有紧密耦合关系的时候,这个软件的重用性就会大大降低.所以一个软件的重用性的高低就取决于它的耦合程度的高低. 耦合度:程序模块之间的关联.依赖程度. 在设计过程中提出:当设计这个软件的体系结构的时候,就发现了这个软件的逻辑运行部分(SimpleRouter类)和输出部分(SimpleRouterFrame类)不能很好的结合起来.即:我们不得不将程序界面的引用(reference to SimpleRouterFrame)一层一层

组件的重用性

什么是组件的重用性? 我们把一个大的功能拆分为一个一个的小模块,比如按钮.表单.下拉框.轮播图等. 提高组件的重用性有什么好处呢? 1. 写更少的代码. 2. 减少开发时间. 3. 代码的bug更少. 4. 占用的字节更少. 为了保证数据的正确性,我们可以对props的数据进行验证,验证方法如下: React.createClass({ propTypes:{ optionArray : React.PropTypes.array } }) React 允许你为组件设置默认的props: var

关于 CSS 的重用性

使用 CSS 大概也有三四个月了,仔细回想了一下这三四个月所写下的CSS,发现都是挺杂乱的.几乎页面的任何一个元素,都有它自己的style,满篇的 float:left; display:block; color:#666: 没有 一种看到就很清爽的样子,而且 给 CSS 文件的大小带来很大的影响. 回想了下,其实大不必这样,可以采用 诸如以下的代码,来提高重用性,也能让页面的可读性变得更强! fl{float:left;} fr{float:right;} w1200{width:1200px

性能测试 - 响应 vs 延迟 vs 吞吐量 vs 负载 vs 扩展性 vs 压力 vs 健壮性

本文译自Niraj Bhatt 所著 Performance Testing - Response vs. Latency vs. Throughput vs. Load vs. Scalability vs. Stress vs. Stress vs. Robustness. 原文地址:https://nirajrules.wordpress.com/2009/09/17/measuring-performance-response-vs-latency-vs-throughput-vs-lo

ACL访问控制列表(标准性、扩展性、命名性)

ACL访问控制列表 访问控制列表的工作原理: 出:已经过路由器处理正离开路由器接口的数据包. 入:已达到路由器接口的数据包,将被路由器处理. ACL对数据流的处理流程: 路由器将对数据包进行匹配,路由器将决定该数据包的通过或拒绝,拒绝后将下一跳匹配共匹配三次直到最后拒绝丢弃. ACL类型 标准访问:根据数据包的源iP地址来允许或拒绝.列表号1~99. 扩展访问:根据数据包的源IP地址.目的IP地址.指定协议.端口和标志来允许或拒绝.列表号100~199. 命名访问:允许使用标准访问或扩展访问,用

监控开发之如何开发简单高性能扩展性强的监控系统

关于如何快速开发一套属于自己的运维监控系统. 记得刚入行的时候,对于监控方面,用的是nagios和cacti,现在大多数中小公司好多都开始搞zabbix了,熟悉zabbix的人,知道他的性能的瓶颈其实主要还是在数据库上,尤其是zabbx_server 针对数据库一些不高效逻辑的查询和写入引起的. 同事针对zabbix开发也搞了半年了,和他交流了下,有很多的想法. zabbix 有些查询完全可以从缓存里面取值,比如redis.memcached,不用非要从数据库里面来搞个消耗性能的大查询,有些监控

服务的扩展性

在编写一个应用时,我们常常考虑的是该应用应该如何实现特定的业务逻辑.但是在逐渐发展出越来越多的用户后,这些应用常常会暴露出一系列问题,如不容易增大容量,容错性差等等.这常常会导致这些应用在市场的拓展过程中无法快速地响应用户的需求,并最终失去商业上的先机. 通常情况下,我们将应用所具有的用来避免这一系列问题的特征称为非功能性需求.相信您已经能够从字面意义上理解这个名词了:功能性需求用来提供对业务逻辑的支持,而非功能性需求则是一系列和业务逻辑无关,却可能影响到产品后续发展的一系列需求.这些需求常常包

服务的扩展性(如何创建具有可扩展性的服务实例,缓存以及数据库)

转自:http://www.cnblogs.com/loveis715/p/5097475.html 在编写一个应用时,我们常常考虑的是该应用应该如何实现特定的业务逻辑.但是在逐渐发展出越来越多的用户后,这些应用常常会暴露出一系列问题,如不容易增大容量,容错性差等等.这常常会导致这些应用在市场的拓展过程中无法快速地响应用户的需求,并最终失去商业上的先机. 通常情况下,我们将应用所具有的用来避免这一系列问题的特征称为非功能性需求.相信您已经能够从字面意义上理解这个名词了:功能性需求用来提供对业务逻

扩展性

服务的扩展性 在编写一个应用时,我们常常考虑的是该应用应该如何实现特定的业务逻辑.但是在逐渐发展出越来越多的用户后,这些应用常常会暴露出一系列问题,如不容易增大容量,容错性差等等.这常常会导致这些应用在市场的拓展过程中无法快速地响应用户的需求,并最终失去商业上的先机. 通常情况下,我们将应用所具有的用来避免这一系列问题的特征称为非功能性需求.相信您已经能够从字面意义上理解这个名词了:功能性需求用来提供对业务逻辑的支持,而非功能性需求则是一系列和业务逻辑无关,却可能影响到产品后续发展的一系列需求.