zoukankan      html  css  js  c++  java
  • 接口和抽象类的区别

    面试题:接口和抽象类的区别

    区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。

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

    区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。

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


    如下给出两者的简单对比表格。

     

    接口

    抽象类

    多继承

    支持

    不支持

    类型限制

    没有

    有,只能是引用类型

    方法实现

    继承类型中必须给出方法实现

    继承类中可以不给出

    扩展性

    比较麻烦

    相对比较灵活

    多层继承

    比较麻烦,需要借助虚函数

    比较灵活

     

    1)密封类:不能被继承的类(俗称“绝后无生殖能力的类”)

    2)抽象类:必须被继承的类。

    1和2是一堆矛盾体,两个关键词绝对不能并排放置。

    3)接口 :没有具体方法实现的过程,只定义方法输入和输出参数,要求子类必须实现的一种特殊类(抽象类所有方法都是abstract则相当于一个接口)。

    4)继承性:某个类是否可以被其他类继承,以及其方法属性是否可以被继承:

    public:无论何种情况,都可以继承。

    internal:只限于本工程内(命名空间里)。

    internal protected:限于本工程并且是继承该父类的子类可以继承。

    protected:继承该父类的子类可以继承。

    private:无论何种情况,都不允许继承。

     

    5)多态性重载函数,重写函数。

    重载如:

    public void fun()和public void fun(int a)

    重写如(必须父-子类)

    public class F

    {

       public virtual void Fun(){……}

    }

    public class S:F

    {

       public override void Fun(){……}

    }

     

    还有一种是“隐藏”,只发生在父类和子类中,子类只要方法名和父类一样,并且加一个new,那么子类函数屏蔽父类的。如:

    public class F

    {

       public void Fun(){……}

    }

     

    public class S:F

    {

       public new void Fun(){……}

    }

     

     

    1)抽象方法:方法必须被子类实现。

    2)虚方法:方法可以由子类继承或者重写。

    接口:所有方法都是“抽象方法”(可以把接口理解成“只有抽象方法”的抽象类)。

    而一般抽象类可以有抽象方法,也可以有一般类的普通方法允许子类继承。

     

  • 相关阅读:
    github
    保存中文文本
    python3与 python2 urllib模块区别
    gitbook 使用粘自csdn
    html基础
    R语言学习笔记之十
    R语言学习笔记之九
    R语言学习笔记之八
    R语言学习笔记之七
    R语言学习笔记之六
  • 原文地址:https://www.cnblogs.com/csj007523/p/2068751.html
Copyright © 2011-2022 走看看