virtual override new 的介绍

virtual override new 的介绍:

C#支持重写实例方法和属性,但是不支持重写字段或者是任何的静态成员。重写的成员要标志为virtual.

重载(override)一个成员,会造成运行时调用最底层的或者说派生得最远的实现。

只有实例成员才可以是Virtual的。static virtual是没有意义的。

Override不管可以重写virtual标志还可以重写abstract类中的抽象成员

对于virtual修饰的成员,可以在子类中用override(重写)new(子类向基类隐藏同名的成员)

具体的示例:

首先我们定义一个基类Class1:

 public class Class1
    {
        public virtual String GetName()
        {
        return "Class1";
        }
    }
声明一个virtual的实例成员GetName

然后再定义一个子类Class2继承Class1

public class Class2:Class1
    {
       public override string GetName()
       {
           return "Class2";
       }
    }
在子类Class2中用override重写了基类Class1中的GetName方法。此时我们调用输出:

BLL.Class1 c1 = new BLL.Class1();
            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/>");
结果是:

Class1
Class2
Class2
其中前2个结果不难理解。解释一下第3个结果

c1 = c2;
            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,具体见入下的结果:

Class1
Class2
Class1

下面再次把Class2中的new换成了override.然后我们再定义一个Class3,具体的定义入下:

public class Class3:Class2
    {
       public override string GetName()
       {
           return "Class3";
       }
    }

 此时我们看到Class2中的GetName是用override,这里Class3继承了Class2,看到GetName也是用override来修饰,原因在于override修饰的成员都回自动的变成virtual成员。所以Class3中可以像上面的那个写法。

此时我们的输出程序如下:

 BLL.Class3 c3 = new BLL.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

具体的理解可以参考上面的解释。

此时把Class3中的override修饰改为new,再次运行程序,结果如下:

Class3
Class2
Class2

具体的理解可以参考上面的解释。

如果把Class2中的override修饰改为new的话,Class3中的修饰符只能为new,如果写成override,编译出错。应该能够override的,需要基类中的成员为virtual override abstract。

如果Class2和Class3中的修饰符全为new的结果输出为:

Class3
Class1
Class2

posted @ 2011-02-11 18:56  chenping2008  阅读(403)  评论(0编辑  收藏  举报