在好久好久之前咱们的祖先将咱们大天然全部能动的物体都定义成“动物”。可是后来在动物的群体当中,有一类动物进化的很是快,它们的智商明显高出其余动物,它们就是“人类”,这也许就是人类文明的起源。架构
所谓的“人类”开始给动物定义级别了,他们认为“人类”是最聪明的,从而将本身和普通的动物划分界限而且人类是主导“动物”世界的头领。[王清培版权全部,转载请给出署名]ide
但是大天然老是充满杀戮,大鱼吃小鱼,小鱼吃虾米。这个时候有个很聪明的“人类”动物他想统治全世界,他想来想去如何对这些动物进行管理,怎么让他们能服从于我。因此他进行策划,想法设法的对这些动物进行分析,观察他们的生活习惯,主动的去跟他们交流。他认为不论是什么动物都将有着本质的特性,这些特性是生命的延续也是动物特征的延续。时间不知道过去了多少,他终于总结出一个让通常动物都很难理解的“抽象”动物图。spa
有了这张图,他得意的不得了。天上飞的我让他们专门去巡逻,陆地上跑的我让他们全天候的伺候我,水里的就跟好玩了,没事出去游游泳。设计
显然他没有将人类在这张图中体现出来,彻底是高度的抽象。咱们也不晓得那我的类是怎么想的,按照咱们如今的理解,这我的类应该是继承自这个“陆地上的动物”。可是咱们如今还不知道他是怎么想的。orm
他以为本身是统治者,因此他不会在图中体现出“人类”的描述。他又进行分析了,他认为我该经过某种方式对这些动物进行管理,也就是说不一样类型的动物应该有着不一样的行为。好比小鸟是会飞的,我必须用笼子把它关起来。鱼是会乱游,也必须有适当的鱼池让它们生成。对象
他又回去捣鼓管理方式的图了。blog
这个“人类”看来对管理没什么经验,按照这种管理方式要累死他呢。全部东西都想一手掌控,在一旁的下手可能有点管理的料,他跟头讲:“头,你这样管理他们可能有点不妥,你应该成立专门的管理群体,专门用来管理或者说是研究不一样种类的动物”。这句话还真是给这个头子开悟了,头子忽然发觉我彷佛有跟强大的武器管理这些乱七八糟的动物了。他交代这个下属去好好策划策划而后给他一个管理的组织架构图。继承
每一个皇帝手下都会有那么几个能干的将领,这个下手还真是有学问,他画了一个他的思路图:接口
这张图再一次给领导头子开了悟,人类既然是动物的统治者,那么就应该对人类的管理组织架构进行抽象。因此他又交代这个下手去考虑考虑画个图给他看看。事务
领导很喜欢这个图,很清晰的表达出了管理与被管理者之间的界限。两个都有着本身的继承关系,组织机构是针对管理体系的,属于虚拟的继承。而动物的继承体现比较明显点,跟咱们的平常生活很像,因此容易理解。经过这个图,思路完全打开了,要对不一样的事务进行概括抽象,这样才能使事务很清晰很好控制,所谓站的高看的远。[王清培版权全部,转载请给出署名]
这个领导就好像成吉思汗,喜欢打仗喜欢征服感,他要征服全世界,要否则上面的那些规划都白费了,得有动物让他管理才行。全部他开始策划组织军队,不论是天上飞的、地上走的、河里游的只要能打仗均可以参军。他开始全身心的设计参军的标准,这个时候我无论你是什么动物,无论你长什么样子,只要符合参军标准就好了。他找来那个下手,跟下手谈论这宏伟的战略目标,而且任手下为军事参谋,辅助他的军事设计和战略目标规划。通过讨论他们得出一个大体的参军标准图:
标准一贴出去,参谋天天都要亲自审核参军者。有这个标准还真方便,基本上来的动物都符合参军标准。军队逐渐成形了,头子要求军事参谋开始设计做战方案。参谋以为最重要的就是团队配合,要将团队的力量往一处使。因此他开始设计做战时的手语动做。就比如特种兵在做战时的做战计划,经过手语的方式表达。[王清培版权全部,转载请给出署名]
参谋真是高人,又开始画图了:
有了这个做战手语后,参谋开始想看看效果了。寻找了一个附近的岛屿开始进攻了,通过很多天的做战后,终于成功的拿下了小岛,小岛的全部动物都受他管理,而且人类也参与了他们的军队开始循环的扩大军队力量。[王清培版权全部,转载请给出署名]
其实说了这么多,目的只有一个,抽象类和接口是有着本质的区别。抽象类体如今群族、组织等一些列有着很明显的层次结构关系的。好比:组织结构、种族、群集。
接口体现某种契约,是必需要遵照的规则,它不用来表现具备继承关系的抽象。好比:生产标准、产品验收标准。因此若是你将接口也视为对类型的抽象是不妥的,接口没有任何实现目的就是为了在面向对象的领域能严格的区分对象和行为的区别。在IL层面上,接口也是抽象的类行为也是虚方法。目的是让咱们站在面向对象的角度使用语言,而语言的特性是为了面向对象的概念作支撑。
下面咱们来用代码模拟上述的模型,首先是对动物世界的高度抽象,因此咱们固然是须要一个抽象类,表示全部动物的基类。
/** * author:深度训练 * blog:http://wangqingpei557.blog.51cto.com/ **/ using System; using System.Collections.Generic; using System.Text; using System.Drawing; namespace ConsoleApplication1 { /// <summary> /// 动物的顶层抽象 /// </summary> public abstract class AnimalBase { /// <summary> /// 动物的肤色 /// </summary> public abstract Color Complexion { get; set; } /// <summary> /// 动物的身高 /// </summary> public abstract int Stature { get; set; } /// <summary> /// 动物的体重 /// </summary> public abstract int Avoirdupois { get; set; } /// <summary> /// 吃饭的动做 /// </summary> /// <param name="food">食物对象</param> public abstract void Dining(object food); } }
我定义了两个基本的属性,Complexion肤色、Stature身高,还有一个动做Dining就是吃饭。为何都是抽象的呢?由于咱们的抽象层次很高,不一样的动物有着不一样的身高、不一样的肤色、不一样的吃饭习惯。因此都是抽象的,表示后面的派生对象能对基类的成员进行具体化。[王清培版权全部,转载请给出署名]
咱们派生一个会飞的动物类:
/** * author:深度训练 * blog:http://wangqingpei557.blog.51cto.com/ **/ using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { /// <summary> /// 会飞的动物基类,可是它的祖先是动物类:AnimalBase /// </summary> public abstract class FlyAnimal : AnimalBase { /// <summary> /// 飞行高度 /// </summary> public abstract int FlyHeight { get; set; } /// <summary> /// 飞行速度(KM/h) /// </summary> public abstract float FlySpeed { get; set; } /// <summary> /// 飞行的行为 /// </summary> public void FlyFun() { Console.WriteLine("起飞吧......."); } } }
在继承了AnimalBase以后,FlyAnimal也就是动物了,可是它增添了不少其余的动物色彩,它是一个会飞动物的基类,只要谁继承它了就会飞了,由于它已经具有飞的能力,至于能飞多高要看孕育的怎么样了呵呵,老鹰必定比麻雀飞的高。[王清培版权全部,转载请给出署名]
咱们孕育一只老鹰吧,但愿咱们都飞的更高:
/** * author:深度训练 * blog:http://wangqingpei557.blog.51cto.com/ **/ using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { /// <summary> /// 老鹰,会飞的。 /// </summary> public class GledeAnimal : FlyAnimal, JoinArmycorps { private int _flyheight = 1000; /// <summary> /// 飞的高度,最高为1000米 /// </summary> public override int FlyHeight { get { return _flyheight;//能飞1000米高 } set { _flyheight = value; //彻底能够控制它飞多高的,要否则后面的仗怎么打啊; } } private float _flyspeed = 100; /// <summary> /// 飞行速度,最快为100KM/h /// </summary> public override float FlySpeed { get { return _flyspeed; } set { _flyspeed = value; //固然也是能够控制的 } } /// <summary> /// 肤色,咱们定义为羽毛颜色 /// </summary> public override System.Drawing.Color Complexion { get { return System.Drawing.Color.Black; } set { //颜色哪能换啊 } } /// <summary> /// 身高,估计也就50CM差很少了 /// </summary> public override int Stature { get { return 50; } set { //身高彷佛能够设置,这里就不支持了。 } } /// <summary> /// 体重,估计也就50斤左右吧。 /// </summary> public override int Avoirdupois { get { return 50; } set { //不会是100斤的。 } } public override void Dining(object food) { Console.WriteLine("比较喜欢吃:" + food.ToString()); } public bool Take300KgPoleaxe() { return true; } public bool Run60MinuteStanding() { return true; } } }
老鹰做为具体的动物,须要实现全部继承下来的抽象成员,惟独一个会飞的行为不须要实现。
继承真是伟大,一辈子下来就具有了飞行的能力,可是也得多加练习才行。
老鹰据说如今能够参军了,它以为本身不去参军简直是浪费,老鹰去看看参军要求,以为能够实现。
军事参谋的参军要求:
/** * author:深度训练 * blog:http://wangqingpei557.blog.51cto.com/ **/ using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { /// <summary> /// 军事参谋贴出来的参军要求 /// </summary> public interface JoinArmycorps { /// <summary> /// 身高CM /// </summary> int Stature { get; set; } /// <summary> /// 体重KM /// </summary> int Avoirdupois { get; set; } /// <summary> /// 是否能拿起300KG中的战斧 /// </summary> /// <returns>true:能拿起,false拿不起来</returns> bool Take300KgPoleaxe(); /// <summary> /// 快速奔跑持续一小时 /// </summary> /// <returns>true:没问题,false歇菜了</returns> bool Run60MinuteStanding(); } }
老鹰应该没问题的,它那么厉害;去参谋那里审核了:
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //构造老鹰 FlyAnimal flyanimal = new GledeAnimal(); flyanimal.FlyFun(); flyanimal.Dining("兔子肉");//给点兔子肉给你吃 JoinArmycorps joinarmycorps = flyanimal as JoinArmycorps; //军事参谋准备采用参军标准进行审核 if (joinarmycorps.Run60MinuteStanding()) { if (joinarmycorps.Take300KgPoleaxe()) { if (joinarmycorps.Stature > 170) { if (joinarmycorps.Avoirdupois > 80) { Console.WriteLine("合格的军人!"); } else { Console.WriteLine("体重不过关!"); } } else { Console.WriteLine("身高不过关!"); } } } Console.ReadLine(); } } }
唉 貌似它体重和身高不够啊 呵呵 不过不要紧,咱们能够孕育大型的老鹰,彻底是为了战争而生的,只须要对老鹰的基因进行培养修改。
总结:其实文章要说明的东西基本上也很清楚了,虽然接口也具有属性和行为,可是它和抽象类是有区别的,这里的参军接口就是一种约定一种规范,老鹰必须必须具有这些因素才行。[王清培版权全部,转载请给出署名]
本文出自 “pattern driven the world” 博客,请务必保留此出处http://wangqingpei557.blog.51cto.com/1009349/961136