接口与抽象类

来源:互联网 发布:阿里云邮企业邮箱登陆 编辑:程序博客网 时间:2024/05/14 19:24
今天我们来学习抽象类和接口,因为他们在很多方面有相似的用法,所以放到一堂课中讲解,看到这个标题的时候,一定有的同学会说接口,没类字呀,它也是类吗?从本质上接口也是类,和抽象类一样,接口也是一种特殊的类。

        作为编程设计者在程序的开发中,设计抽象类和接口就是为了让他们用来被继承的,当一个项目经过需求分析后,一般正规的软件开发公司会由项目经理或经验丰富的开发人员,先根据需求和要实现的大部分功能来设计抽象类和接口,然后再将项目功能分发到开发人员或小组,具体来实现这些抽象类和接口,这样做的好处就是,规范了成员的命名和参数类型,合并代码时减少错误同时方便修改,代码的可读性更强,充分利用面向对象中的三大特性,今后大家在开发时团队协作是避免不了的,所以定好各成员的名字和功能是非常重要的,VS中也提供了一个按成员名称查找其运用位置的功能,如果我们的命名各有不同,可以想象一下,后期负责合并的人员将多么的痛苦,而且项目运行后的维护,也将成为一个困难。

        上面说的是定义抽象类和接口的一个重要的优点,当然很多人在最初开发时,无法灵活的设计出他们,也不知道在这个项目的什么功能该设计抽象类的什么成员,这就得靠日积月累的开发经验来做基础,同时做完一个项目后,要学会总结,有可能的话,应再次优化,将重复的功能或定义的代码使用到继承性和多态性,只有这样才能不断的进步,是不是有点像毛主席修改自己的著作的感觉,这样才能成功。在学习的最开始,同学们只要能了解他们的定义和实现就可以了。

抽象类


        在类五中我介绍过抽象类,提到过抽象类的存在是因为成员中有可能存在抽象成员,抽象成员就是只有定义而没有具体实现的成员,如果一个类中含有了抽象成员,那么这个类一定要定义成抽象类,抽象类或抽象成员都是使用abstract作为修饰符声明的定义。那么什么是抽象成员呢?没有实现又是什么意思呢?

       举这样一个例子,比如人类吃饭是个方法,但是因为全世界的人类太多,吃饭使用的工具也不一样,所以我们可以把吃饭定义成一个抽象的方法,让继承人类的子类去自定义吃饭的动作,如果是中国人就用筷子吃,如果是西方人就用刀叉吃;再比如还是人类吃饭,因为根据信仰和习俗的不同,我们在定义人类时,就应该把人类所吃的食物定义成一个抽象属性,当是继承的人们是伊斯兰教时,食物中要排除猪肉,当是佛教时,食物中要排除荤食等,当然了我们所定义的人类就应该也是抽象类了。

        咦!继承的人类的人们自己定义怎么吃饭、吃什么食物,让我们回想起类八中当子类继承父类时,用自己的定义来实现父类的成员,这不会就是重写吧?答案是对,这就是重写,我们写一个抽象方法的定义和抽象属性的定义,让我们来看看具体的语法:

//抽象方法没有方法体,只有定义,使用非private关键字修饰

   abstract  public/protected  void  Method([,]);

//抽象属性get和set访问器没有定义,其实get和set访问器也是二个方法,也可以说抽象属性的get、set访问器没有方法体。有关属性同学们可以到类二中温习一下。 

abstract  public  int I  {get;set;}

        abstract可以修饰类、方法、属性、索引器及事件,也就是抽象类中可以包含五种成员:抽象嵌套类、抽象方法、抽象属性、抽象索引器、抽象事件,事件将来会讲解,其他四种成员我们都有讲解,抽象就是只有给他们做定义,如返回值、参数个数、成员标识符、访问修饰符等,具体这些成员要做什么在抽象成员中没有定义,现在我们来想一下,为什么抽象成员中没有常见的字段、构造器等?回想一下,我们在学习构造方法时,说过一个字段即使你不赋初值,在构造的过程时,编译器也会给字段赋一个初值,静态字段调用静态构造方法方法,实例字段调用实例构造方法,而且构造方法是默认存在的,而且有自己的定义,字段会有值、构造方法被默认定义,他们都有实现,所以这两个不能定义为抽象成员,析构方法也是如此,还有以后将要学习到的委托,都不能定义成抽象成员。

       这时一定又有同学问到,上节课我们不是学到了重写父类成员时,必须把这些成员规定为虚方法吗?必须使用virtual关键字吗?对你记得没错,其实没有实现的成员就可以认为是虚成员,只是这时的虚成员使用了abstract来修饰,成为抽象成员。

       抽象类无法实例化,也就是无法创建抽象类的对象,原因是抽象类中有可能存在抽象成员,抽象成员没有设定所完成的功能,所以无法创建抽象类真正的具体的对象。这些抽象成员由继承抽象类的子类来实现,如果子类不完全实现这些抽象成员,其自身又成为了抽象类,还需要子类的子类来实现这些抽象成员。

      下面我做了一段代码,使用了抽象属性和抽象方法,并且用子类将抽象类实现,再次调用了覆写的属性和方法,这个例子没有太复杂的代码,定义了一个Ren的抽象类,其中包括信仰属性和吃饭的方法,有继承的子类如中国人类、西方人类来根据自己的需要自己定义他们的含义和使用方法,本例中我只写了一个子类。当讲解到接口时,我再举个实际计算的例子。

 

抽象类实例本文来自http://www.cnblogs.com/wangfang224120999/archive/2008/12/19/1355940.html