抽象类特点
- 1.抽象成员必须标记为abstract,并且不能有任何实现(大括号也没有)。
- 2.抽象成员必须在抽象类中。
- 3.抽象类不能被实例化。
- 4.子类继承抽象类后,必须把父类中的所有抽象成员都重写。(若子类也是一个抽象类,则可以不重写)
- 5.抽象成员的修饰符不能是private。
- 6.在抽象类中可以包含实例成员。抽象类的实例成员可以不被子类实现。
- 7.抽象类是有构造函数的,虽然不能被实例化。
- 8。若父类的抽象方法有参数和返回值,则继承这个抽象父类的子类在重写父类的方法的时候必须传入对应的参数和返回值。
如何判断是使用虚方法来实现多态还是定义抽象类来实现多态
- 若父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
- 若父类中的方法没有默认实现,并且父类也不需要被实例化,则可以将该类定义为抽象类。
接口
- 接口是一种规范,也是一种能力。
- 若一个类继承了一个接口,则这个类必须实现这个接口中的所有成员。
- 接口的功能要单一
- 接口不能被实例化,即不能new。
- 接口中的成员不能加“访问修饰符”,成员访问修饰符默认为public,不能修改。
- 接口中的成员不能有任何实现。
- 接口中只能有方法、属性、索引器、事件,不能有“字段”和构造函数。
- 接口与接口之间可以继承。
- 接口只能去继承类,类既可以继承接口,也可以继承类。
- 显示实现接口的目的:解决方法的重命名
- 当一个抽象类实现接口的时候,需要子类去实现接口。
区别
区别 | 抽象类 | 接口 |
---|---|---|
1 | 被子类实现 | 被类实现 |
2 | 可做方法声明,也可实现方法 | 只能做方法声明 |
3 | 变量是普通变量 | 变量只能是公共的静态常量 |
4 | 重构的结果 | 设计的结果 |
5 | 均是抽象具体对象,但是接口的抽象级别最高。 | |
6 | 可以有具体的方法和属性 | 只能有抽象方法和不可变常量 |
7 | 抽象类别 | 抽象功能 |