引言

在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

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

  1. python基础----封装、封装与扩展性

    从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有egon和alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 首先我们要了解 要封装什么 你钱包的有多少钱(数 ...

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

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  3. Zend server最大化应用程序的性能、扩展性和可用性

    如果我有8个小时去砍到一棵树,我会花6个小时磨斧子”——林肯(美国总统) 你可以知道? 世界页面访问量的峰值超过7000万每分钟. CloudFare公司服务器问题,导致785000站点崩溃一小时. ...

  4. MySQL - 扩展性 3 负载均衡:眼花缭乱迷人眼

    负载均衡的基本思路很简单: 在一个服务器集群中尽可能地的平均负载量. 基于这个思路,我们通常的做法是在服务器前端设置一个负载均衡器.负载均衡器的作用是将请求的连接路由到最空闲的可用服务器上.如图 1, ...

  5. MySQL - 扩展性 2 扩展策略:氪金氪脑任君选

    如果将应用的所有数据简单地放在一台 MySQL 服务器实例上,就不用谈什么扩展性了.但是业务能稳定持续的增长,那么应用肯定会碰到性能瓶颈. 对于很多类型的应用而言,购买更高性能的机器能解决一大部分性能 ...

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

    译文在后面. State Threads for Internet Applications Introduction State Threads is an application library ...

  7. 设计模式如何提升 vivo 营销自动化业务扩展性 | 引擎篇01

    在<vivo 营销自动化技术解密 |开篇>中,我们从整体上介绍了vivo营销自动化平台的业务架构.核心业务模块功能.系统架构和几大核心技术设计. 本次带来的是系列文章的第2篇,本文详细解析 ...

  8. Atitit.兼具兼容性和扩展性的配置方案attilax总结

    Atitit.兼具兼容性和扩展性的配置方案attilax总结 文件配置法1 Jdbc多数据源文件配置发1 Bat文件配置法1 改进的文件配置法(采用类似i18n技术) 推荐1 使用自动化pc_id的方 ...

  9. Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结

    Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结 1. 什么是可扩展的应用程序?1 2. 松耦合(ioc)2 3. 接口的思考 2 4. 单一用途&模块化,小粒度化2 ...

随机推荐

  1. hdu5618 (三维偏序,cdq分治)

    给定空间中的n个点,问每个点有多少个点小于等于自己. 先来分析简单的二维的情况,那么只要将x坐标排序,那么这样的问题就可以划分为两个子问题,,这样的分治有一个特点,即前一个子问题的解决是独立的,而后一 ...

  2. 让CentOS系统时间同步

    CentOS系统时间同步的步骤如下: 新装的CentOS系统服务器可能设置了错误的,需要调整时区并调整时间. 如下是CentOS系统使用NTP来从一个时间服务器同步cp /usr/share/zone ...

  3. 在html中禁用自己主动完毕

    输入框输入内容时总是显示历史输入历史记录,现禁用的方法是加入一个属性: <input type="text name="txt_xm" autocomplete=& ...

  4. C++ Primer笔记10_运算符重载_赋值运算符_进入/输出操作符

    1.颂值运营商 首先来福值运算符引入后面要说的运算符重载.上一节说了构造函数.拷贝构造函数:一个类要想进行更好的控制.须要定义自己的构造函数.拷贝构造函数.析构函数.当然,还有赋值运算符.常说的三大函 ...

  5. 【原创】leetCodeOj --- Factorial Trailing Zeroes 解题报告

    原题地址: https://oj.leetcode.com/problems/factorial-trailing-zeroes/ 题目内容: Given an integer n, return t ...

  6. Android各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 具体解释

    看资料的时候常常看到各种VGA,全都混了,无奈,找了些资料总结了下,分享给大家: 这些术语都是指屏幕的分辨率. VGA:Video Graphics Array,即:显示画图矩阵,相当于640×480 ...

  7. ibatis实战之OR映射

    相对Hibernate等ORM实现而言,ibatis的映射配置更为简洁直接,以下是一个典型的配置文件. <?xml version="1.0" encoding=" ...

  8. 数据结构读书笔记(二)(C语言)

    (一)循环链表 存储类型 typedef struct LNode { ElemType data; struct LNode *next; }; typedef struct LNode *Link ...

  9. vc++笔记十一

    一.LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 连接器LNK是通过调用cvtres.exe完毕文件向coff格式的转换的,所以出现这样的错误的原因就是cvtres.exe出现了问题 ...

  10. #define XXX do{ XXX } while(0) 为什么使用

    #define XXX do{ XXX } while(0) 为什么使用 时常会遇到一个非常"奇怪的宏定义", rt.(欧西巴...思考不够深刻啊, 皮鞭, 啪啪啪) 近期又遇到这 ...