浅析C#中new、override、virtual关键字的区别

http://blog.csdn.net/zhoufoxcn/archive/2007/01/31/1498685.aspx

 

 

http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx

 

总结:

1、要实现Virtual方法就必须要使用override或new关键字(new和override产生的机理不同)。

 

2、New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。Override主要用来对基类的方法(?不对吧,父类的只能声明成虚方法啊)和虚方法进行重写。

 

 

3、override 覆盖父类方法的前提是父类声明成virtual 类型的;

否则编译器报错,如下:

 d:/Polymorphism.cs(182,30): error CS0506: “Operationjj.Sonclass.Method4()”:
        继承成员“Operationjj.Fatherclass.Method4()”未被标记为
        virtual、abstract 或 override,无法进行重写
d:/Polymorphism.cs(134,21): (与前一个错误相关的符号位置)  

 

 

4、而当子类中用new时,无论父类是虚方法还是普通方法,都会隐藏父类方法。

 

 


参考:

1、http://hi.baidu.com/wildwithjoy/blog/item/e5f32cedae357ed0b31cb1f7.html

 

2、http://space.itpub.net/12639172/viewspace-512078

 

 

 

code:

***********************************************************

 

 using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Operationjj
{
    public class Polymorphism
    {
        static void Main(string[] args)
        {
            //创建一个Sonclass类的son对象
            Sonclass son = new Sonclass();

            //创建一个Fahterclass类的father对象
            Fatherclass father = new Fatherclass();

            //创建一个Fahterclass类的对象fs对象,但是用Sonclass类来实现,这种方式是允许的。
            //意思就是父亲到儿子的房子去了,看到的油画应该是父亲的油画,房子还是从父亲那继承下的房子。
            //对象fs所引用出的成员,实际是从父类中继承来的成员,不是继承来的成员(如儿子自己买的电器)fs是无权访问的。
            //父类需要子类去实现的这种方式会在抽象类和接口中会用到
            Fatherclass fs = new Sonclass();


            //先观察一下子使用new的Method方法中三对象的结果
            //--------------------------------------
            //子类的对象 son 引用的Method方法打印的是子类的Mehtod方法
            son.Method();

            //子类的Method方法因为使用了new,只是覆盖了父类的Method方法,所以父类的对象fs引用的Method方法打印出来的还是从父类中继承 下来的Method方法
            fs.Method();

            //父类中的Method方法不变
            father.Method();

            Console.WriteLine("------------");


            //先观察一下 子类使用override的Method1方法中三对象的结果
            //-------------------------------------------------
           
            //子类的对象 son 引用的Method1方法 打印出的是子类的Method1方法
            son.Mehtod1();

            //子类中的Method1方法,因为使用了override,重写了父类的Method1方法,
            //所以父类的对象fs引用的Method1方法打印出的 还是从子类中继承下来的Mehtod1方法
            //子类中 只存在子类的Method1方法,结果如下:
            fs.Mehtod1();

            //父类中的Method1方法不变
            father.Mehtod1();

            Console.WriteLine("-------------------");

       
            //先观察一下 子类Sonclass使用override和base.method1的Method2方法中三对象的结果
            //--------------

            //因为使用了override,重写了父类的Method2方法
            //因为使用了base.Method1,所以在子类中会调用父类的Method方法
            //子类的对象son引用的Method1方法打印的是子类的Method2方法和父类的Method1方法
            son.Method2();

            //子类中的Mehtod2方法,因为使用了override,重写了父类的Method2方法,
            //所以父类的对象fs引用的Method2方法打印出的是还是从子类中继承下来的Method2方法
            //子类中 只存在子类的Method2方法,结果如下:
            fs.Method2();

            //父类中的Method2方法不变
            father.Method2();
            Console.WriteLine("------------------");

 

            son.Method3();
            fs.Method3();
            father.Method3();


            son.Method4();
            fs.Method4();
            father.Method4();

 


        }
    }
   
    class Fatherclass
    {
        //定义一个公有的Method方法,子类中用new隐藏本方法
    public  void Method()
    {
        Console.WriteLine("我是父类中的公有Method方法");
        Console.WriteLine();
   
    }
       
       
        // 定义一个虚方法Method1,子类中重写Method1
        public virtual void Mehtod1()
        {
            Console.WriteLine("我是父类中的虚方法Method1");
            Console.WriteLine();
        }

 

        public virtual void Method2()
        {
            Console.WriteLine("我是父类中的虚方法Method2");
            Console.WriteLine();
       
        }


        //定义一个公有的Method3,子类中用new隐藏本方法
        public virtual void Method3()
        {
            Console.WriteLine("我是父类中的公有的方法Method3");
            Console.WriteLine();


        }


        //定义一个非虚方法Method4,子类中用override覆盖本方法
        public virtual void Method4()
        {
            Console.WriteLine("我是父类中的虚方法Method4");
            Console.WriteLine();
              
       
        }


    }


    class Sonclass : Fatherclass
    {
        //定义一个公有Method方法,隐藏了父类的Mehtod方法
        public new void Method()
        {
            Console.WriteLine("我是子类中的Mehtod方法,使用new关键字,显式地隐藏父类的同名virtual方法");
            Console.WriteLine();
        }

        //定义一个重写父类Method1的方法Method1
        public override void Mehtod1()
        {
            Console.WriteLine("我是子类中的Mehtod1方法,覆盖父类中的virtual同名方法,此时 Sonclass中没有了父类中的Method1方法");
            Console.WriteLine();

        }

        //定义一个重写父类Method2的方法Mehtod2,同时使用base调用父类的Method2
        public override void Method2()
        {
            Console.WriteLine("我是子类中的Method2,覆盖父类中的同名virtual方法,调用base.method1");
            base.Mehtod1();
            Console.WriteLine();
        }


        //定义一个公有Method3方法,隐藏了父类的Mehtod3方法
        public new void Method3()
        {
            Console.WriteLine("我是子类中的Mehtod3方法,使用new关键字,显式地隐藏父类的同名公有方法");
            Console.WriteLine();

        }


        //定义一个重写父类Method4的方法Method4
        public override void Method4()
        {
            Console.WriteLine("我是子类中的Mehtod4方法,覆盖父类中的同名virtual方法,此时 Sonclass中没有了父类中的Method4方法");
            Console.WriteLine();

        }

    }
}

 

 

*************************************************************

 

 

result:

 

****************************************************************

 

C:/>csc d:/Polymorphism.cs
Microsoft (R) Visual C# 2005 编译器 版本 8.00.50727.42
用于 Microsoft (R) Windows (R) 2005 Framework 版本 2.0.50727
版权所有 (C) Microsoft Corporation 2001-2005。保留所有权利。


C:/>Polymorphism.exe
我是子类中的Mehtod方法,使用new关键字,显式地隐藏父类的同名virtual方法

我是父类中的公有Method方法

我是父类中的公有Method方法

------------
我是子类中的Mehtod1方法,覆盖父类中的virtual同名方法,此时 Sonclass中没有了父类
中的Method1方法

我是子类中的Mehtod1方法,覆盖父类中的virtual同名方法,此时 Sonclass中没有了父类
中的Method1方法

我是父类中的虚方法Method1

-------------------
我是子类中的Method2,覆盖父类中的同名virtual方法,调用base.method1
我是父类中的虚方法Method1


我是子类中的Method2,覆盖父类中的同名virtual方法,调用base.method1
我是父类中的虚方法Method1


我是父类中的虚方法Method2

------------------
我是子类中的Mehtod3方法,使用new关键字,显式地隐藏父类的同名公有方法

我是父类中的公有的方法Method3

我是父类中的公有的方法Method3

我是子类中的Mehtod4方法,覆盖父类中的同名virtual方法,此时 Sonclass中没有了父类
中的Method4方法

我是子类中的Mehtod4方法,覆盖父类中的同名virtual方法,此时 Sonclass中没有了父类
中的Method4方法

我是父类中的虚方法Method4


C:/>

 

 

*********************************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值