抽象类和接口、虚方法和抽象方法
抽象类
抽象类是类,用class声明。当一个类中有抽象的方法时,这个类也必须被声明为抽象的。抽象的方法或类都使用abstract修饰符来修饰。抽象类中可以有属性和非抽象的方法。抽象类不能被实例化,因为它有抽象的方法,无法调用。所以抽象类一般被设计用于继承。继承一个抽象类需要实现其所有的抽象方法,否则的话子类也应该被声明为抽象的。可以定义一个抽象类的引用来指向它的一个非抽象子类的对象。出处:https://www.jianshu.com/p/99cd192867bf
抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。
1 | public abstract class ArEditViewModelBase : UfcViewModel |
接口
接口比抽象类的抽象程度更高,它完全不包括实例方法或属性。接口使用关键字interface来声明。接口中只包含方法的声明,它就是用来描述类具有什么功能,而并给出每个功能的具体实现。接口中所有方法都自动地属于public,所以不用显示地声明。实现一个接口就要实现它所有的方法。
1 | public interface IApp |
比较
相同点
接口和抽象类都不能被实例化;
可以定义一个抽象类或接口类型的引用,用来引用子类或实现类;
不同点
继承抽象类时可以不实现其全部的抽象方法。当然这时子类也要被声明为抽象的。实现接口时所有的方法都要被实现;
每个类最多继承一个抽象类,而可以实现多个接口;
抽象类可以有main方法,并且我们可以运行它,接口不能有main方法;
抽象类有构造方法,接口没有;
使用抽象类时添加一个新的实例方法时,不需要修改子类;而为接口增加方法时,其所有实现类都要修改;
在需要复用父类提供的一些基本代码,并且另外有部分代码需要子类实现时可以使用抽象类,它就像一个类的模板,如jdk中的aqs抽象类;如果要实现多继承那就必须使用接口;
接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
抽象方法
1 抽象方法必须在抽象类中定义
2 抽象方法必须在派生类(子类)中实现
3 抽象方法没有提供实现部分
4 无法创建抽象类或接口的实例
1 | //抽象方法(子类必须有这个方法实现,方法实现需要加上 override 关键字) |
虚方法
1 虚方法不必须在派生类(子类)中重写实现
2 虚方法声明方法实体
3 可以创建虚方法类的实例
4 如果抽象类中有虚方法,不必须在派生类(子类)中重写
在项目中的运用,比如模块或者一个界面是给其他人调用的模块,但是在其他的系统中可能要重写函数或者重写整个界面,那么是就可以设置为virtual类,要重写的函数前面加virtual关键字。
1 | //虚方法(子类可以重写也可以不重写,方法实现需要加上 override 关键字) |