解析接口和抽象类

时间:2020-12-15 17:22:14

    对于接口和抽象类,大大的提高面向对象的功能。这里总结一下抽象类和接口。

1、抽象类
    在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域(从对象抽象出来的类)进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 

    比如:在大话中举了一个动物参加叫声比赛的:有许多猪狗猫………..等等对象,要进行参加比赛这时候,如果使用面向对象来进行编程的话,那么 我们就可以抽出猪狗猫…...的类,来进行实例化对象。同样这些类中也有很多的相识的地方,比如其中都有叫声这个方法,名字这个属性等等,为了减少代码的重复性,这时候,我们可以再在这些类中把重复的地方抽出来。这就是抽象类了。
如:abstract class Animal
{
Protected abstract string getShoutSound();//这是抽象方法,抽象方法没有方法体,直接在括号后面添加";"
}
    抽象方法,应该必须在具体的类中进行重写。不然抽象类就没有意义。比如叫声这个方法,要在具体的猪狗猫的类中进行不同的实现。还有抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

抽象类代表的是一种抽象的概念。根本目的是用来继承的。具体类不是用来继承的。

抽象类和普通类的区别:
①抽象类不可以实例化。就像动物这个抽象类,在实际生活中没有具体的对象与之对应,所以抽象类的实例化是没有意义的。②抽象方法必须被子类重写。不然抽象方法的存在就没有意义了。③含有抽象方法的类必须要定义为抽象类,不论其中是否包含一些其他的方法。
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。
 
2、接口

    接口是从对象中抽象出来的特殊的方法,只有部分的具体的类具有。就是不同类的对象具有相同的特殊方法,这时候可以将方法抽象为接口。


语法:
   接口中的方法和属性前面不能有修饰符并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。


    实现接口,其实也是一种多态的方法。完成了不同对象根本不可能完成的任务。当进行“变出东西的方法”如果是叮当就用万能口袋,如果是孙悟空就使用七十二变。
接口定义:interface change
{
String ChangeThing(string thing);
}
允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。

实现接口的类就必须要实现接口中的所有的方法和属性。一个类可以支持多个接口,多个类也可以支持相同的接口。

3、抽象类和接口的区别

代码实现:
1、抽象类可以给出一些成员的实现,而接口却不包含成员的实现。所以接口是比抽象类更加抽象的行为。
2、抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现。
3、一个类只能继承一个抽象类,但是可以实现多个接口。

定义:
①设计层面不同

   抽象类作为很多子类的父类,它是一种模板式设计。如果发现在猪狗猫,这些动物毛掉了仍然可以生长,这个方法没有在写出,那么这时候可以再抽象类中进行添加方法,并给出实现,子类中的代码可以不进行更改。
   而接口是一种行为规范。是从多个不同对象中抽象出来的共同的方法。如果在抽象出第二个方法,那么实现接口的类需要重新实现接口。

②抽象层面:
    类是对对象的抽象,抽象类是对类(一些相识的类的对象)的整体(字段,属性,方法)的抽象,接口是对类的局部的行为(行为跨越了不同类的对象)进行抽象。
    从设计的角度讲,抽象类是从子类中发现公共的东西,泛化出父类,是重构的结果。而接口是根本不知道子类的存在,预先进行定义的,是设计的结果。
比如:猫狗,都是动物有很多相识的地方,所以可以让他们继承动物这个抽象类。而飞机,麻雀,超人,是完全不相关的类,他们由都会飞,所以这时候可以让他们来实现相同的接口。

总是不论是接口,抽象类,类,甚至是对象,都是在不同层次,不同角度的进行抽象的结果,共性就是抽象。

4、为什么
至于使用接口和抽象类的好处是什么,目的是解耦,将业务和实现分离开。对于这一块的理解还不是很深刻,接下来有新的认识在放到这里。