黑马程序员--抽象类与接口

 

C#抽象类和接口的区别

一、抽象类(abstract class):

 

1、 抽象类是特殊的类,只是不能被实例化,除此之外,具有类的其他特性;

 

2、抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类;

 

3、具体派生类必须覆盖基类的抽象方法;4、抽象方法只作声明,而不包含实现,可以看做没有实现体的虚方法;

 

5、抽象类可以派生自另一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如不覆盖,则其派生类必须覆盖它们。

 

 

二、接口(interface):

 

1、接口是引用类型的,类似于抽象类,不能被实例化;2、成员可以包含方法、属性、索引器和事件;

 

3、接口中不能包含常量、字段、构造函数、析构函数或静态成员;4、派生类必须实现接口的所有成员;

 

5、接口中的所有成员默认为public,因此接口中不能有private修饰符;6、一个类可以直接实现多个接口,接口之间用逗号隔开。

 

 

 

三、抽象类和接口的相同点:

 

1、都可以被继承;2、都不能被实例化;3、都可以包含方法声明;4、派生类必须实现未实现的方法。

 

四、抽象类和接口的区别:

 

      区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;

 

而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。

 

这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,

 

那么狗的一般特性,都会在京哈,牧羊犬中找到,那么狗相对于京哈和牧羊犬来说,就属于这类事物的抽象类型;

 

而对于“叫”这个动作来说,狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口。

  区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。

例如:

public abstract class AbsTest
{    
  public virtual void Test()    
   {       
        Debug.WriteLine("Test");    
   }    
  public abstract void NewTest();
}
public interface ITest
{   
    void Test();   
    void NewTest();
}

 

      区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;

而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。

  区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。

 

  知道了两者的区别,再来说说,接口相对于抽象类的优势。

  好处一,接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。

  好处二,.Net的类型继承只能是单继承的,也就是说一个类型只能继承一个类型,而可以继承多个接口。其实,我对于这一点也比较赞同,多继承会使继承树变的混乱。

  好处三,由于接口只是定义属性和方法,而与真正实现的类型没有太大的关系,因此接口可以被多个类型重用。相对于此,抽象类与继承类的关系更紧密些。

  好处四,通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。

当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候,可以返回接口对象,这样调用端,

只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其他元素。

  好处五,减少值类型的拆箱操作。对于Struct定义的值类型数据,当存放集合当中,每当取出来,都需要进行拆箱操作,这时采用Struct+Interface结合的方法,从而降低拆箱操作。

  相对于抽象类来说,接口有这么多好处,但是接口有一个致命的弱点,就是接口所定义的方法和属性只能相对于继承它的类型(除非在继承类中修改接口定义的函数标示),

那么对于多层继承关系的时候,光用接口就很难实现。因为如果让每个类型都去继承接口而进行实现的话,首先不说编写代码比较繁琐,有时候执行的结果还是错误,

尤其当子类型对象隐式转换成基类对象进行访问的时候。

  那么这时候,需要用接口结合虚方法来实现。其实在继承中,到底使用接口还是抽象类。

接口是固定的,约定俗成的,因此在继承类中必须提供接口相应的方法和属性的实现。

而对于抽象类来说,抽象类的定义方法的实现,贯穿整个继承树,因此其中方法的实现或者重写都是不确定的。

因此相对而言,抽象类比接口更灵活一些。

    总的来说,接口和抽象类是.Net为了更好的实现类型之间继承关系而提供的语言手段,而且两者有些相辅相成的关系。

posted @ 2013-05-20 10:38  流浪的雁  阅读(139)  评论(0编辑  收藏  举报