• C#中接口与抽象类的区别


      接口与抽象类是面试中经常会考到的点,容易混淆。首先了解下两者的概念:

      一、抽象类:
          抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

      二、接口:      

      接口是引用类型的,类似于类,和抽象类的相似之处有三点:        

      1、不能实例化;       

      2、包含未实现的方法声明;       

      3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

      另外,接口有如下特性: 接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

    详细的,定义上的区别分析,可以参考此篇博客:http://www.cnblogs.com/lovemyth/archive/2008/09/08/828909.html

      这里概括、形象化地解释一下接口和抽象类的区别:

      接口主要是对行为的抽象;抽象类主要是对类的抽象。

      更加形象的比喻如下:

      1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
      2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

      代码级的区别展示:

      一、抽象类:

      抽象类里面可以包括部分具体实现,而接口则不行。

      

    public abstract class AClass
    {
        private int x;
        private int y;
        public int X { get { return x; } }
        public int Y { get { return y; } }
     
        public float Sum() { return X + Y; }
     
        public abstract float Average();
    }
     
    public class BClass : AClass
    {
        public override float Average()
        {
            return Sum() / 2;
        }
    }

      如上面的例子,在抽象类中,实际包括了:几处具体的实现,二个属性,一个求和方法。
      同时对于接口来说,根本就无法定义字段成员,也就是private int x,private int y;它是无法定义的。

      二、接口:

      对于接口实现同样的功能,你只能做到:

    public interface A
    {
        public int X{get;}
        public int Y{get;}
        public float Sum();
    }

      你无法提供Sum的任何功能。

      小结:

      1、我们在理解一门技术上,首先可以从其用处上来考虑,要认识到这门技术是做什么用的。这样才能加深对于知识的理解。后续项目中使用到了接口和抽象类会继续完善此文档。

      2、文章仅仅是自己的总结与体会(包括粘贴),希望能为大家提供到帮助。感谢CSDN的phy,和CNBLOG用户残叶

      

  • 相关阅读:
    分享知识-快乐自己:Spring整合定时器
    自定义响应结构 AjaxResult()
    日期工具类 DateUtils(继承org.apache.commons.lang.time.DateUtils类)
    处理json的工具类({本类为处理json的工具类})
    单机版 RedisUtils({基本操作封装工具类})【三】
    单机版 JedisUtil({基本操作封装工具类})【二】
    单机版 RedisPoolUtil({基本操作封装工具类})【一】
    序列化工具类({对实体Bean进行序列化操作.},{将字节数组反序列化为实体Bean.})
    分享知识-快乐自己:遍历Map集合
    自己的新闻后台管理系统
  • 原文地址:https://www.cnblogs.com/Ebony-Ivory/p/4290747.html
Copyright © 2020-2023  润新知