当前位置:编程学习 > C#/ASP.NET >>

C#之美—抽象类与接口孽缘

 

 在很久很久以前我们的祖先将我们大自然所有能动的物体都定义成“动物”。但是后来在动物的群体当中,有一类动物进化的非常快,它们的智商明显高出其他动物,它们就是“人类”,这也许就是人类文明的起源。
所谓的“人类”开始给动物定义级别了,他们认为“人类”是最聪明的,从而将自己和普通的动物划分界限并且人类是主导“动物”世界的头领。[王清培版权所有,转载请给出署名]
可是大自然总是充满杀戮,大鱼吃小鱼,小鱼吃虾米。这个时候有个很聪明的“人类”动物他想统治全世界,他想来想去如何对这些动物进行管理,怎么让他们能服从于我。所以他进行策划,想法设法的对这些动物进行分析,观察他们的生活习惯,主动的去跟他们交流。他认为不管是什么动物都将有着本质的特性,这些特性是生命的延续也是动物特征的延续。时间不知道过去了多少,他终于总结出一个让一般动物都很难理解的“抽象”动物图。

有了这张图,他得意的不得了。天上飞的我让他们专门去巡逻,陆地上跑的我让他们全天候的伺候我,水里的就跟好玩了,没事出去游游泳。
显然他没有将人类在这张图中体现出来,完全是高度的抽象。我们也不晓得那个人类是怎么想的,按照我们现在的理解,这个人类应该是继承自这个“陆地上的动物”。但是我们现在还不知道他是怎么想的。
他觉得自己是统治者,所以他不会在图中体现出“人类”的描述。他又进行分析了,他认为我该通过某种方式对这些动物进行管理,也就是说不同类型的动物应该有着不同的行为。比如小鸟是会飞的,我必须用笼子把它关起来。鱼是会乱游,也必须有适当的鱼池让它们生成。
他又回去捣鼓管理方式的图了。

这个“人类”看来对管理没什么经验,按照这种管理方式要累死他呢。所有东西都想一手掌控,在一旁的下手可能有点管理的料,他跟头讲:“头,你这样管理他们可能有点不妥,你应该成立专门的管理群体,专门用来管理或者说是研究不同种类的动物”。这句话还真是给这个头子开悟了,头子突然发觉我似乎有跟强大的武器管理这些乱七八糟的动物了。他交代这个下属去好好策划策划然后给他一个管理的组织架构图。
每个皇帝手下都会有那么几个能干的将领,这个下手还真是有学问,他画了一个他的思路图:

这张图再一次给领导头子开了悟,人类既然是动物的统治者,那么就应该对人类的管理组织架构进行抽象。所以他又交代这个下手去考虑考虑画个图给他看看。

领导很喜欢这个图,很清晰的表达出了管理与被管理者之间的界限。两个都有着自己的继承关系,组织机构是针对管理体系的,属于虚拟的继承。而动物的继承体现比较明显点,跟我们的日常生活很像,所以容易理解。通过这个图,思路彻底打开了,要对不同的事务进行归纳抽象,这样才能使事务很清晰很好控制,所谓站的高看的远。[王清培版权所有,转载请给出署名]
 
这个领导就好像成吉思汗,喜欢打仗喜欢征服感,他要征服全世界,要不然上面的那些规划都白费了,得有动物让他管理才行。所有他开始策划组织军队,不管是天上飞的、地上走的、河里游的只要能打仗都可以参军。他开始全身心的设计参军的标准,这个时候我不管你是什么动物,不管你长什么样子,只要符合参军标准就行了。他找来那个下手,跟下手谈论这宏伟的战略目标,并且任手下为军事参谋,辅助他的军事设计和战略目标规划。经过讨论他们得出一个大致的参军标准图:

标准一贴出去,参谋每天都要亲自审核参军者。有这个标准还真方便,基本上来的动物都符合参军标准。军队逐渐成形了,头子要求军事参谋开始设计作战方案。参谋觉得最重要的就是团队配合,要将团队的力量往一处使。所以他开始设计作战时的手语动作。就好比特种兵在作战时的作战计划,通过手语的方式表达。[王清培版权所有,转载请给出署名]
参谋真是高人,又开始画图了:

有了这个作战手语后,参谋开始想看看效果了。寻找了一个附近的岛屿开始进攻了,经过数日的作战后,终于成功的拿下了小岛,小岛的所有动物都受他管理,并且人类也参与了他们的军队开始循环的扩大军队力量。[王清培版权所有,转载请给出署名]
其实说了这么多,目的只有一个,抽象类和接口是有着本质的区别。抽象类体现在群族、组织等一些列有着很明显的层次结构关系的。比如:组织结构、种族、群集。
接口体现某种契约,是必须要遵守的规则,它不用来表现具有继承关系的抽象。比如:生产标准、产品验收标准。所以如果你将接口也视为对类型的抽象是不妥的,接口没有任何实现目的就是为了在面向对象的领域能严格的区分对象和行为的区别。在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> 
  

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,