2010-03-16 104 views
6

抽象和虚拟都将被子类覆盖比什么是差异。抽象和虚拟有什么区别?

是虚拟方法有身体和抽象只是一个签名????

+0

顺便说一句,部分方法,相比于抽象方法,使您可以创建一个没有不需要被重写的实现方法。 – Brian 2010-03-16 13:43:56

回答

24

是虚拟方法有身体和抽象只是一个签名????

没错。的一点是,虚拟方法可以在派生类中重写,而抽象方法必须被重写。同样,至少有一个抽象方法的类本身必须是抽象的,即它不能直接实例化,因为它的实现(部分)缺失。

最后,每一个抽象方法是虚拟暗示。基本上只是意味着该方法在运行时被分派到正确的类,因此可以被重写以实现运行时多态性。

+0

由于抽象方法必须被覆盖,它们实际上是一个像接口和代码一样的契约,除非你正确地实现它们,所以它是让你的代码的用户实现他们必须实现的代码的一种方式,特别是如果他们懒惰,对吗? – Xaisoft 2012-07-19 18:44:39

+0

@ Xaisoft正确,但是虚拟(非抽象)方法也构成一个契约,因为契约是从使用类(=客户端)的角度来看的。重要的是客户可以使用它所宣传的类的功能。 – 2012-07-19 19:03:21

+1

我同意,但我的意思是,如果你声明一个虚拟的方法,客户端即使他们应该也不必实现它。另外一个虚拟方法可以有默认行为。客户必须实现一个抽象方法,它不能具有默认行为。如果你真的想要实施一种方法并将责任放在客户端上,似乎你抽象路线与虚拟路线相比的唯一原因是。 – Xaisoft 2012-07-19 19:32:52

17

抽象意味着你必须覆盖它。虚拟意味着你可以覆盖它。或多或少。

+4

此外:使用类中的抽象方法,您的整个类将是抽象的,这意味着您不能创建此类的实例,只能创建派生的非抽象子类。 – dbemerlin 2010-03-16 13:40:18