none
new作为修饰符与override的区别是什么? RRS feed

  • 问题

  • new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。override 修饰符会扩展继承成员的实现。按照帮助文档上的意思我的理解是:new修饰符是影藏基类的成员,override修饰符是重写基类成员,那么他们到底有什么区别?以下是我做的一个实验:
         /// <summary>
        /// 基类
         /// </summary>
        class BaseClass
        {
            public virtual double Pl
            {
                get 
                { 
                    return 3.14;
                }
            }
        }
        /// <summary>
        /// 派生类
        /// </summary>
        class SubClass:BaseClass
        {
            public new double Pl
            {
                get 
                {
                    return 3.1415926;
                }
            }
        }
            //Main方法
            static void Main(string[] args)
            {
                //第一种情况(各自初始化自己类的对象,不管是使用new还是override修饰打印结果都是一样的)
                BaseClass bc1 = new BaseClass();
                Console.WriteLine(bc1.Pl);
                SubClass sc1 = new SubClass();
                Console.WriteLine(sc1.Pl);
                //第二种情况(把派生类的对象转换成基类对象,则出现不同的效果)
                BaseClass bcs = sc1;
                //使用new修饰打印的是基类的属性值,使用override修饰打印则是派生类的属性值
                Console.WriteLine(bcs.Pl);
                Console.Read();
            }
    我不知道为什么是这个结果!新手,求人帮我详细介绍一下这两个关键字的作用和异同。

    • 已编辑 -迷- 2012年4月12日 12:32
    2012年4月12日 12:30

答案

  • dear

    1.基本上子类别使用new/override 会产生一样的结果,都是改写父类别

    2.把子类别传给父类别时,new/override就会有不同效果,new并没有改写父类别,而override就改写了

    父类别不一定是子类别,子类别一定是父类别


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已建议为答案 Jone Zhu 2012年4月13日 0:18
    • 已标记为答案 -迷- 2012年4月13日 15:42
    2012年4月12日 15:50

全部回复

  • dear

    1.基本上子类别使用new/override 会产生一样的结果,都是改写父类别

    2.把子类别传给父类别时,new/override就会有不同效果,new并没有改写父类别,而override就改写了

    父类别不一定是子类别,子类别一定是父类别


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已建议为答案 Jone Zhu 2012年4月13日 0:18
    • 已标记为答案 -迷- 2012年4月13日 15:42
    2012年4月12日 15:50
  • Override 覆写 就是把原来的换掉了
    new        新的 就是两个共存着

    使用override重写方法,也就是将原有的方法覆盖掉,通过父类引用一样只能看到重写后的方法,只有重写后的方法可以使用,而原有方法已经不复
    存在了不能再使用了;而使用new,则是将方法隐藏,但是通过不同方法的调用,仍是可以使用的,也就是两个方法同时存在,都可以使用

  • override不能重写非虚方法或静态方法
  • 重写的基方法必须是 virtual、abstract 或override 的
  • override 声明不能更改virtual 方法的可访问性
  • override 方法和virtual 方法必须具有相同的访问级别修饰符
  • 不能使用修饰符new、static、virtual 或abstract 来修改override 方法
  • 重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称
  • 属性可以使用virtual,override 和abstract 关键字,就像方法一样,但这几个关键字不能用于字段

    new的功能

  • new作为运算符来创建一个对象和调用构造函数
  • 作为修饰符
  • 用于在泛型生命中约束可能用作类型参数的参数的类型

    当new作为修饰符使用时,new关键字可以在派生类中隐藏基类的方法,就是说使用派生类的方法是调用的方法是new关键字新定义的方法,而非基类
    的方法,当然如果还要使用基类中的方法也是可以调用来使用的。

2012年4月13日 15:25