virtual override new 的介绍
virtual override new 的介绍:
C#支持重写实例方法和属性,但是不支持重写字段或者是任何的静态成员。重写的成员要标志为virtual.
重载(override)一个成员,会造成”运行时”调用最底层的或者说派生得最远的实现。
只有实例成员才可以是Virtual的。static virtual是没有意义的。
Override不管可以重写virtual标志还可以重写abstract类中的抽象成员
对于virtual修饰的成员,可以在子类中用override(重写)和new(子类向基类隐藏同名的成员)。
具体的示例:
首先我们定义一个基类Class1:
{
public virtual String GetName()
{
return "Class1";
}
}
然后再定义一个子类Class2继承Class1
{
public override string GetName()
{
return "Class2";
}
}
Response.Write(c1.GetName());
Response.Write("<br/>");
BLL.Class2 c2 = new BLL.Class2();
Response.Write(c2.GetName());
Response.Write("<br/>");
c1 = c2;
Response.Write(c1.GetName());
Response.Write("<br/>");
Class2
Class2
Response.Write(c1.GetName());
这个时候将c2赋值给了c1,在调用c1方法的GetName方法时,我们可以通过c1.GetType().Name来知道c1指向托管堆中的Class2对象,同时在Class2中override了Class1中的GetName方法,所以在调用c1.GetName的时候实际调用的是c2的GetName方法。
下面把Class2中的override换成new来修饰GetName方法,new修饰符是表明子类中同名的方法对基类中同名的方法隐藏。此时调用c1.GetName的方法显示的是Class1.虽然c1指向的是Class2这个内存对象。但是Class2中的GetName方法对基类不可见,所以最终还是输出了Class1,具体见入下的结果:
Class2
Class1
下面再次把Class2中的new换成了override.然后我们再定义一个Class3,具体的定义入下:
{
public override string GetName()
{
return "Class3";
}
}
此时我们看到Class2中的GetName是用override,这里Class3继承了Class2,看到GetName也是用override来修饰,原因在于override修饰的成员都回自动的变成virtual成员。所以Class3中可以像上面的那个写法。
此时我们的输出程序如下:
Response.Write(c3.GetName());
Response.Write("<br/>");
c1 = c3;
Response.Write(c1.GetName());
Response.Write("<br/>");
c2 = c3;
Response.Write(c2.GetName());
Response.Write("<br/>");
结果如下:
Class3
Class3
具体的理解可以参考上面的解释。
此时把Class3中的override修饰改为new,再次运行程序,结果如下:
Class2
Class2
具体的理解可以参考上面的解释。
如果Class2和Class3中的修饰符全为new的结果输出为:
Class1
Class2