接口 抽象类
2012-11-15 20:30 coodoing 阅读(604) 评论(0) 编辑 收藏 举报1、抽象类,接口,虚函数
抽象类就是这样一种类,描述了一种事物的共性,它不能实例化,只能通过它的子类实例化。
实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
接口 |
抽象类 |
|
多继承 |
支持 |
不支持 |
类型限制 |
没有 |
有,只能是引用类型 |
方法体 |
父类中方法无方法体;继承类型中必须给出方法实现 |
父类中可以有方法体实现;继承类中可以不给出 |
扩展性 |
比较麻烦,一旦接口中定义新的方法,相应的子类都需要添加新方法 |
比较灵活 |
方法修饰 |
方法都是抽象的,public abstract |
可以有非抽象方法 |
私有方法或变量 |
不能存在 |
可以存在 |
|
不能实例化 |
抽象类不能被密封,不能实例化 |
抽象方法和虚函数区别:
虚方法的关键字是virtual
抽象方法的关键字是abstract
(1)虚方法:可以在抽象类和非抽象类(普通类)中定义,在定义虚方法时必须实现虚方法(在定义虚方法时需要写实现方法的代码或者至少要写一个分号)。在子类中可以被重写,也可以不重写。如果要实现的功能和父类中的一样,就没必要被重写,直接用就行。
(2)抽象方法:必须定义在抽象类中,即拥有抽象方法的类一定是抽象类。必须写在父类中,在子类中必须被重写,在定义抽象方法时不能实现方法(在定义抽象方法时不能有大括号和代码)。
2、重写和隐藏
重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的
隐藏:在派生类中使用new声明一个跟父类一样的方法,那么父类的方法将被隐藏起来,但是还是存在的,可以用base来调用。这样相当于子类有两套名称一样的方法。
3、重写和重载
override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。
重写(覆盖)的规则:
1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
3、重写的方法的返回值必须和被重写的方法的返回一致;
4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
6、静态方法不能被重写为非静态的方法(会编译出错)。
overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
重载的规则:
1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;