代码改变世界

接口 抽象类

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、方法的异常类型和数目不会对重载造成影响;