zoukankan      html  css  js  c++  java
  • 浅谈C#中的接口和抽象类

    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者之间的差异:

  • 相关阅读:
    进程隐藏类
    MFC中一些使用的方法
    c++/vc++的一些学习方法
    随意更改桌面壁纸
    Winsock异步模型之(事件通知模型 WSAAsyncSelect)
    开发外挂的一些原理
    ios 图片
    得到cell的坐标
    取出字符串中的空格
    ios 获取当前的日期,年月日
  • 原文地址:https://www.cnblogs.com/chengbing2011/p/4202431.html
Copyright © 2011-2022 走看看