当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable = new ClassName();声明一个类的实例之前,它都不存在于真实的内存空间中。这个关键字在类的继承中非常常用,用来提供类方法的多态性支持。
例如,有一个类Test,Test类拥有两个方法Hello()和greet():
public class test
{
public void Hello()
{
System.Console.WriteLine("hello, world!");
}
.....
}
类TestMe派生自类Test,那么当你使用如下的代码:
Test a = new TestMe();
创建一个TestMe类的新实例后,假如你试图执行如下的代码:
a.Hello();
那么,自然就会运行基类Test的Hello()方法,但是如果你想给予派生类TestMe一个它自己的Hello()方法,你就要在Test类中将Hello()方法声明为虚拟的:
public virtual void Hello()
{
...
}
然后在派生类中以override关键字表示覆盖基类的方法:
public class TestMe : Test
{
...
public overrice void Hello()
{
System.Console.WriteLine("hello from TestMe class!!!");
}
....
}
这时调用a.Hello(),就会出现“hello from TestMe class!!!”字样,而不是“Hello,world!”说明基类的方法已经被覆盖了。这就是多态性的表现。
例如
public static void Test(int a){System.Console.WriteLine(a.ToString());}
这是一个公有的静态函数,函数名为Test,无返回值,有一个整形参数a,作用是把a的值输出在屏幕上。作者: 段朝骞 时间: 2013-9-27 00:13
virtual override new
简单说override将virtual的内容覆盖了,new不覆盖virtual内容,而是重新开辟了空间
例如:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace virtual与override
{
class Program
{
class A
{
public virtual string Name
{
get;
set;
}
public virtual void Say()
{
Console.WriteLine("A的Say");
}
}
class B:A
{
private string name;
new public string Name
{
get
{ return name; }
set
{
if (value != string.Empty)
{
name = value;
}
else
{
name = "不知道";
}
}
}
public override void Say()
{
Console.WriteLine("B的Say");
}
}
static void Main(string[] args)
{
B b = new B();
A a = b;
b.Name = "张三";
a.Name = "李四";
Console.WriteLine(b.Name);//结果为张三,说明a.Name="李四"是另一个属性,new并不覆盖virtual
Console.WriteLine(a.Name);//结果为李四
b.Say();//结果为B的Say
a.Say();//结果为B的Say,override将父类中的virtual方法覆盖重写了
A ac =new A();
ac.Name = "111";
Console.WriteLine(ac.Name);//结果为111
ac.Say();//结果为A的Say,证明A中的virtual也是可以实现的