A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李荣斌 中级黑马   /  2013-2-27 11:55  /  1721 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

new和override都能实现对父类方法的隐藏,它们有什么区别?

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

6 个回复

倒序浏览
new这个关键字使用频率非常高,主要有3个功能:

a)     作为运算符用来创建一个对象和调用构造函数。

b)     作为修饰符。

c)      用于在泛型声明中约束可能用作类型参数的参数的类型。
Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名
总结:New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。Override主要用来对基类的方  
               法和虚方法进行重写。

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
override :
(1)方法提供从基类继承的成员的新实现。 由 override 声明重写的方法称为重写基方法。 重写的基方法必须与 override 方法具有相同的签名
(2)不能重写非虚方法或静态方法。重写的基方法必须是 virtual、 abstract 或 override 的。
(3)override 声明不能更改 virtual 方法的可访问性。 override 方法和 virtual 方法必须具有相同的 访问级别修饰符
(4)重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、 abstract 或 override 的。
(5)您不能使用 new、 static 或 virtual 修饰符来修改 override 方法。
new :
(1)在用作修饰符时, new 关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本
不同点:
new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。
override 修饰符会扩展继承成员的实现
下面是一个简单的测试
class BaseClass
    {
        public virtual void Show()
        {
            Console.WriteLine("我来自基类show方法");
        }
        public void Print()
        {
            Console.WriteLine("我来自基类Print方法");
        }
    }
   class DerivedClass:BaseClass
   {
       public override void Show()
       {
           Console.WriteLine("我来自继承类show方法");
       }
       public new void Print()
       {
           Console.WriteLine("我来自继承类Print方法");
       }
   }
     static void Main()

    {
            DerivedClass dClass = new DerivedClass();             dClass.Show();
            dClass.Print();
      //将父类指向了子类
            BaseClass baseClass2 = new DerivedClass();
            baseClass2.Show();
            baseClass2.Print();
程序输出结果:
            /*
我来自继承类show方法
我来自继承类Print方法
我来自继承类show方法
我来自基类Print方法
             */


    }
结论:从以上可以看出,
使用new修饰符,基类的方法Print并没有消失而是隐藏,在将父类指向子类时,父类并没有运行子类的Print方法,而是执行了自己的方法。
使用override扩展了基类的方法,在将父类指向子类时,父类并执行了子类的Show方法,重写了父类Show方法

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
安玉波 发表于 2013-2-27 12:07
new这个关键字使用频率非常高,主要有3个功能:

a)     作为运算符用来创建一个对象和调用构造函数。

总结的非常好!
回复 使用道具 举报
康晓璞 发表于 2013-2-27 13:57
override :
(1)方法提供从基类继承的成员的新实现。 由 override 声明重写的方法称为重写基方法。 重写的 ...

使用new修饰符,基类的方法Print并没有消失而是隐藏,在将父类指向子类时,父类并没有运行子类的Print方法,而是执行了自己的方法。
使用override扩展了基类的方法,在将父类指向子类时,父类并执行了子类的Show方法,重写了父类Show方法

这两句很精辟!
回复 使用道具 举报
override是重载所继承的类型方法的 而被继承的类方法必须加virtual 才可以被重载new 运算符
1.用于创建对象和调用构造函数 例:Class_Test MyClass = new Class_Test();
2.也用于为值类型调用默认的构造函数 例:int myInt = new int(); myInt 初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0;
3.不能重载 new 运算符。
4.如果 new 运算符分配内存失败,则它将引发 OutOfMemoryException 异常。 new 修饰符
使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
new这个关键字主要有两点功能,
1)是可以实例化类对象,2)在子类中实现父类中已有的方法加new表示隐藏父类方法(或更新方法)
override主要是用于提供派生类对基类方法的新实现,这个基类方法必须具有abstract 、virtual关键字。
而且子类和父类的方法签名必须相同,访问修饰符必须一样。

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马