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-09-10 12:09:55

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

提高Java代码重用性的三个措施

措施一:改写类的实例方法 通过类继承实现代码重用不是精确的代码重用技术,因此它并不是最理想的 代码重用机制.换句话说,如果不继承整个类的所有方法和数据成员,我们无法 重用该类里面的单个方法.继承总是带来一些多余的方法和数据成员,它们总是 使得重用类里面某个方法的代码复杂化.另外,派生类对父类的依赖关系也使得 代码进一步复杂化:对父类的改动可能影响子类;修改父类或者子类中的任意一 个类时,我们很难记得哪一个方法被子类覆盖.哪一个方法没有被子类覆盖;最 后,子类中的覆盖方法是否要调用父类中的对应方法

SCUT —— 提高代码可重用性的 Sass 工具库

SCUT 是提供给前端开发者的 Saas 工具集,能帮助提高对一般样式代码模式的执行(implementations of common style-code patterns). Scut 工具集可以帮助用户避免重复写代码,扩大代码的可重用性. Scut 工具集可以处理模式(patterns)遇到的下列问题: pattern 是不直观的. pattern 需要简写 pattern 涉及到一些重要的最佳实践 pattern 是极为常见的,(至少)有点讨厌. Scut 工具集的目标是实现可重用性的

<转载>客户案例:Docker 为 ADP 提供安全性和扩展性

背景 ADP 是基于云的人力资本管理 (HCM) 解决方案的最大全球性供应商.ADP 拥有超过 63 万家客户,惠及 100 多个国家或地区的 3500 多万用户.ADP 为其客户提供的解决方案不仅包括薪资服务,还全方位涵盖了 HCM 的完整范畴,在其中每个领域都有针对 SMB.中型市场和大型企业量身定制的版本. 挑战 ADP 面临三个重大挑战. 第一个是安全性.在 ADP,安全性是重中之重,因为他们处理的是很敏感的信息.美国政府将 ADP 视作"关键基础架构",因为它们存储着包括 5

IBM POWER8处理器的新砝码:开放和扩展性

[天极网服务器频道5月13日消息]2014年4月28日,IBM正式发布POWER8处理器,新的处理器强调开放性和可扩展性.POWER8系统是首个OpenPOWER兼容系统,也是第一款充分利用目前所有OpenPOWER创新成果的产品.这让POWER8处理器从IBM的专有产品转变为POWER8生态圈的协同产品. IBM POWER8所面向的是当前最为热门的新兴负载,包括大数据.云计算.移动和社交等.IBM一直倡导.参与和支持Linux和开源软件,并将开源技术融入POWER平台.去年IBM针对 Pow

asp.net的10个提升性能或扩展性的秘密(一)

简介 Asp.net有很多值得你挖掘的"秘密",当你发现了它们,将会给你网站的性能和可扩展性带来巨大提升!例如,对于Membership以及Profile提供程序有一些秘密的瓶颈,它们很容易被解决,从而使认证和授权更加快速.另外,asp.net的http管线可以为每一个请求作处理,防止执行了某些不必要的代码而遭受攻击.不只是这些,asp.net工作进程能够突破默认限制,从而完全发挥它的威力.在浏览器端(不是在服务器端)的页面分段输出缓存能显著减少由于请求访问所需要占用的大量下载时间.在

优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads

译文在后面. State Threads for Internet Applications Introduction State Threads is an application library which provides a foundation for writing fast and highly scalable Internet Applications on UNIX-like platforms. It combines the simplicity of the multi

六步走战略,助您实现SQL Server存储扩展性提升

  打算对SQL Server存储进行优化?以下六项提示将帮助大家充分利用自己的宝贵资源. SQL Server可扩展性是否已经成为系统优先级列表中的顶端选项?您是否正在努力寻找对SQL Server数据库性能加以优化的途径?也许向外扩展并不是最理想的选择,那么大家不妨遵循以下六个步骤,相信能够更为轻松高效地实现业务规模提升: 1)尽量利用现有SQL Server组件 扩展SQL Server是一项繁琐而耗时的工作,涉及多个系统.分区数据库.内存.存储.CPU以及网络适配器.我们不妨先从最大程度

使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍

一.前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的.      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC.ORM.SOA.分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的

软件系统的后台管理中心的功能扩展性和易用性

网页制作Webjx文章简介:网站管理页面设计技巧:布局中的黄金法则. 关于"管理中心"的界面设计框架,一般我们都会选择传统的"工"字结构,顶部是形象区,左侧是功能列表区,右侧是操作区,这种结构的功能扩展性和易用性都是非常好的,几乎90%以上的软件系统的后台管理中心都是采用这样的结构.         在实际设计工作中我们发现,用户总是希望能把操作区的区域尽量变大,以最大限度满足业务工作,提高使用效率.我们对信息的浏览习惯于向下扩展,进行纵向滚动.也就是说在显示器分辨