黑马程序员技术交流社区
标题: 什么是虚方法? [打印本页]
作者: qly2046 时间: 2014-1-2 17:58
标题: 什么是虚方法?
本帖最后由 qly2046 于 2014-1-3 09:46 编辑
今天视频面试,吕老师问到了虚方法?由于复习没有涉及到这方面,所以没有回答。
请问什么是虚方法?作用是什么?怎么使用?谢谢
作者: 卖火柴 时间: 2014-1-2 18:41
当类中的方法声明前加上了virtual修饰符,我们称之为C#虚拟方法 ,反之为非虚。使用了virtual修饰符后,不允许再有static、abstract或override修饰符。对于非虚的方法,无论被其所在类的实例调用,还是被这个类的派生类的实例调用,方法的执行方式不变。而对于虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。
下面的例子说明了C#虚拟方法与非虚方法的区别。
例子:
using System;
class A
{
public void F(){Console.WriteLine("A.F");}
public virtual void G(){Console.WriteLine("A.G");}
}
class B:A
{
new public void F(){Console.WriteLine("B.F");}
public override void G(){Console.WriteLine("B.G");}
}
class Test
{
static void Main()
{
B b=new B();
A a=b;
a.F();
b.F();
a.G();
b.G();
}
}
例子中,A类提供了两个方法:非虚的F和C#虚拟方法 G.类B则提供了一个新的非虚的方法F,从而覆盖了继承的F;类B同时还重载了继承的方法G.那么输出应该是:
A.F
B.F
B.G
B.G
注意到本例中,方法a.G()实际调用了B.G,而不是A.G.这是因为编译时值为A,但运行时值为B,所以B完成了对方法的实际调用。
作者: 卖火柴 时间: 2014-1-2 18:43
恭喜你顺利通过面试~!
作者: yuanlianxi03 时间: 2014-1-2 19:04
可以用virtual实现多态性的一种,virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。在调用的时候,根据堆中对象的实际类型调用对应的虚拟方法
你面试的是哪一期的啊,亲
作者: qly2046 时间: 2014-1-2 19:16
11期,已经录取了。你呢?
作者: qly2046 时间: 2014-1-2 19:17
谢谢了,已经顺利被录取了!你怎么样呀?代码一大坨君:lol
作者: 卖火柴 时间: 2014-1-2 20:39
我妈说 快过年呀,年后再去,上·10来天再回来。费周折的,自己多看看,把课程提前学下, 才保险能跟上。
作者: yuanlianxi03 时间: 2014-1-2 21:09
我准备报12期,现在还没开始报名,正在苦苦等待中
作者: 师弟 时间: 2014-1-3 02:04
虚方法是实现多态的一种手段,通过声明在virtual ,在派生类种声明为override, 那么在执行该方法时,就采用迟绑定技术,向派生类往下一个一个的去找,直到找到他的实际创建类型类或不再override
作者: lei130102 时间: 2014-1-3 09:13
--virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。
--virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。
- class TestClass
- {
- public class Dimensions
- {
- public const double PI = Math.PI;
- protected double x, y;
- public Dimensions()
- {
- }
- public Dimensions(double x, double y)
- {
- this.x = x;
- this.y = y;
- }
-
- public virtual double Area()
- {
- return x * y;
- }
- }
-
- public class Circle : Dimensions
- {
- public Circle(double r) : base(r, 0)
- {
- }
-
- public override double Area()
- {
- return PI * x * x;
- }
- }
-
- class Sphere : Dimensions
- {
- public Sphere(double r) : base(r, 0)
- {
- }
-
- public override double Area()
- {
- return 4 * PI * x * x;
- }
- }
-
- class Cylinder : Dimensions
- {
- public Cylinder(double r, double h) : base(r, h)
- {
- }
-
- public override double Area()
- {
- return 2 * PI * x * x + 2 * PI * x * y;
- }
- }
-
- static void Main()
- {
- double r = 3.0, h = 5.0;
- Dimensions c = new Circle(r);
- Dimensions s = new Sphere(r);
- Dimensions l = new Cylinder(r, h);
- // Display results:
- Console.WriteLine("Area of Circle = {0:F2}", c.Area());
- Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
- Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
- }
- }
- /*
- Output:
- Area of Circle = 28.27
- Area of Sphere = 113.10
- Area of Cylinder = 150.80
- */
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |