2009年10月5日星期一

抽象类(abstract class),接口(interface),抽象方法(abstract method),虚拟方法(virtual method)的异同

抽象类(abstract class)是一种特殊的类,它不能被实例化只能被继承,换句话说他只能做其他类的父类。主要目的是为了让所有的子类有共同的父类。抽象类中可以有抽象方法(abstract method),虚拟方法(virtual method) 和普通的方法。抽象方法不能有Body,即它只能在子类中用用override重写。虚拟方法有Body,根据需要,可以在子类总用override重写,也可以不重写而直接用父类中的Body.
接口(interface)不是类,只是一个用interface关键字定义的实体(entity),所以不可以实例化。接口内仅仅定义了一些没有函数体(body)的方法名和参数类型,这一点类似于抽象类中的抽象方法,所以接口有点类似于一个只包含抽象方法的抽象类。接口中的方法都必须是公开的。接口和虚拟类的一个主要的区别是子类可以继承多个接口但是只能有一个抽象的父类。
抽象类和子类之间的本质是相同的,所以轿车,卡车,巴士可以有共同的抽象类机动车。但是人,轿车可以有共同的接口IMovable interface。抽象类中可以有属性字段或者常量,接口中只能有方法名(规定了名称和参数的接口)。如果向接口中增加一个新的方法,需要跟踪所有的实现该接口的类,在类中重写这个新增加的方法。如果向抽象类中增加一个新的方法,可以在抽象类中实现这个方法(virtual method或者 public method),那么所有的子类中都可以自动使用这个方法。
最后一点,抽象方法只能存在于抽象类中,虚拟方法(virtual method)可以存在于抽象类中也可以在普通类中。在具体的应用中,如果不同的实现仅仅是有相同的方法,那么最好共同继承自一个接口;如果属于同一类事物,具有相同的属性则他们应该共同继承自一个抽象类。

没有评论:

发表评论