C#中接口为"其他方面互不相干"的类型提供公共的服务和特征;C#中class只支持但继承,使用接口却支持多继承,例如:C#中System.String是从System空间中的4个interface继承而来。
public sealed class String:ICompare,ICloneable,ICovertible,IEnumerable;C#中对class使用sealed关键字修饰,代表这个类不能够被在其他类继承。

接下来描述一下2者的区别:


1.两者表达的概念不一样,抽象类是一类事物的高度聚合,那么继承子类相对这个抽象类来说是一种"是"的关系,接口是定义行为的规范,因此实现接口的类相对于接口来说,"是行为需要按照接口来完成"。举个例子,花是所有花类的统称,牡丹是花,玫瑰是花,那么花相对牡丹和玫瑰来说是抽象类。而对于发出香味这一动作来说,香水也会发出香味。前者就是所说的抽象类,后者就是所说的接口。

2.抽象类在定义类型方法时候,可以给出实现部分,也可以不给出实现部分,而对于接口来说,其中所有的定义都不给出实现部分,例如:

public abstract DemoClass
{
    public virtual void VirtualTest()
    {
        Console.WriteLine("This is a virtual function");
    }
    
    public abstract void AbstractTest();
}

public interface IDemoInterface
{
    void InterFaceTest();
    void InteFaceDemo();
}
View Code

3.继承类对于2者所涉及的方法的实现是不同的。继承类对于抽象类所定义的抽象方法可以不需要重写,也就是说可以沿用抽象类的 方法,而对于接口来说,定义的接口或者属性都必须在继承类中给出相应的实现。

4.由区别3可以得出,如果在抽象类中新增一个方法,继承类可以不需要做改变,但是如果在接口中新增了一个接口方法,必须在子类 中做相应的变化,实现新增的方法。

接下来,简单介绍一下接口相对于抽象类的优劣:

1.接口不光可以作用于引用类型也可以作用于值类型,抽象类只能作用于引用类型 ;

2..NET的类型只能实现单继承,但是接口可以实现多继承;

3.接口类只定义类属性和方法,而与真正的实现类没有太大关系,抽象类与继承类之间的关系就比较紧密了;

4.通过接口可以减少类型暴露的属性和方法,从而便可以保护类型对象,一个实现接口的类型,可能包含其他方法或者属性,但是方法 返回的时候,可以返回接口对象,这样,调用端只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其 他元素;

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

其实在继承中,到底使用接口还是抽象类。接口是固定的,约定俗成的,因此在继承类中必须提供接口相应的方法和属性的实现。而对于 抽象类来说,抽象类的定义方法的实现,贯穿整个继承树,因此其中方法的实现或者重写都是不确定的。因此相对而言,抽象类比接口更 灵活一些。

以下通过图表简单总结一下2者之间的差异:

 

posted on 2015-01-04 22:34  边城愚者  阅读(218)  评论(0编辑  收藏  举报