黑马程序员技术交流社区

标题: 有了抽象方法为什么还要有虚方法? [打印本页]

作者: 百川    时间: 2014-3-19 01:32
标题: 有了抽象方法为什么还要有虚方法?
本帖最后由 百川 于 2014-3-19 13:23 编辑

有了抽象方法为什么还要有虚方法?既然虚方法本身就是用来被改写的,那么直接并不实现其方法体不是更省事?实际应用中父类虚方法有需要调用的时候么?
作者: 鬼鬼    时间: 2014-3-19 01:41
虚方法不是用来被重写的,只是可以被子类重写。先不说实际应用中是否需要在子类中调用父类方法,很常见的一种情况是,父类本身也是具有实际意义的,也是可以用来实例化对象的。此时,实例化对象需要进行的各项操作,自然需要其对应类中定义的各方法做支撑。
说得再直白一点,不是所有父类都只是用来派生子类的,有一些父类本身也有实际意义,也是要拿来用的,所以自然需要实现它里面定义的各方法。
作者: 张变    时间: 2014-3-19 09:37
区别:
抽象方法必须得定义在抽象类中,而抽象类不能被实例化,
而虚方法所属的父类便可以被实例化,
作者: shangxin    时间: 2014-3-19 10:30
1、虚方法就是以virtual关键字修饰并在一个或多个派生类中实现的方法,子类重写的虚方法则以override关键字标记。虚方法调用,是在运行时确定根据其调用对象的类型来确定调用适当的覆写方法。.NET默认是非虚方法,如果一个方法被virtual标记,则不可再被static、abstrcat和override修饰。

2、抽象方法就是以abstract关键字修饰的方法,抽象方法可以看作是没有实现体的虚方法,并且必须在派生类中被覆写,如果一个类包括抽象方法,则该类就是一个抽象类。因此,抽象方法其实隐含为虚方法,只是在声明和调用语法上有所不同。abstract和virtual一起使用是错误的。


虚方法:

概念:使用关键词Virtual创建的方法称为虚方法

用法:将关键词Virtual添加到方法的返回类型的前面

模样:public virtual void Method(int i) { }

特点:

1.方法定义后面必须有“{}”,可以有实现体,也就是说“{}”里可以有实现体也可以没有。

2.可以定义在除密封类的所有类中。

3.虚方法在派生类中可以被重写也可以不被重写



抽象方法:

概念: 使用关键词abstract创建的方法称为抽象方法.

用法: 将关键字 abstract 添加到方法的返回类型的前面.

模样: public abstract void Method(int i);

特点:

1.没有实现体,方法定义后面是分号”;”

2.抽象方法必须定义在抽象类中

3.抽象方法在派生类中必须被重写

4.存在抽象方法的类必须定义成抽象

作者: Max_骏    时间: 2014-3-19 11:38
抽象方法:声明引入一个新的虚拟方法,但不提供该方法的实现。相反,非抽象类的派生类需要重写该方法以提供它们自己的实现。由于抽象方法不提供任何实际实现,因此抽象方法的方法体只包含一个分号。
虚拟方法:若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚拟方法。若其中没有 virtual 修饰符,则称该方法为非虚拟方法。非虚拟方法的实现是不会变的:无论是在声明它的类的实例上调用该方法还是在派生类的实例上调用,实现都是相同的。与此相反,一个虚拟方法的实现可以由派生类取代。
两者的区别:1. 虚拟方法必须有实现部分,并为派生类提供了覆盖该方法的选项 抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。
2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写 虚方法不是 也不必要重写。其实如果
类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。
3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。抽象方法不能声明方法实体 而虚方 法可以   包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化!

作者: 百川    时间: 2014-3-19 13:22
谢谢大家,明白啦~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2