当前位置:编程学习 > C#/ASP.NET >>

请教new和override

第一段代码:
class Program
    {
        static void Main(string[] args)
        {
            Person stu = new Student();
            stu.work();
            Console.ReadKey();
        }
    }
class Person
    {
        public virtual void work()
        {
            Console.WriteLine("我正在工作");
        }
    }
class Student : Person
    {
        public new void work()   //把new换成override 
        {
            Console.WriteLine("我正在认真学习");
        }
}
上述代码输出:我正在工作

如果把new换成override ,输出结果就变成:我正在学习
请教一下,这是为什么,new和override 有啥区别?这种区别有啥实际意义。谢谢!!! --------------------编程问答-------------------- new 用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。  

Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名,此关键字不可以用于重写非虚方法和静态方法,与其配套使用的关键字是Virtual、abstract、Override。与此同时,Override方法还不可以修改Virtual方法的可访问性,Override方法和Virtual方法必须具有相同的访问修饰符,不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法 --------------------编程问答-------------------- Student 中继承了父类Person,Student 中的work()被new修饰符隐藏,调用父类的work(),因此显示为::我在工作
如果换成override ,则父类work()被Student 中的work()重写覆盖掉,调用的则是Student 中的work,因此显示:我在学习 --------------------编程问答-------------------- 到底stu.work();是调用的父类的work还是子类的work啊,如果是子类的,那下面的代码
class Program
    {
        static void Main(string[] args)
        {
            Person stu = new Student();
            stu.work();
            Console.ReadKey();
        }
    }
    class Person
    {
        public  void A()
        {
            Console.WriteLine("我正在工作");
        }
    }
    class Student : Person
    {
        public  void work()
        {
            Console.WriteLine("我正在认真学习");
        }
    }
为什么又要报错呢?说person中没有work --------------------编程问答--------------------
引用 1 楼 wuyq11 的回复:
new 用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。  

Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名,……

楼上说明的很详细了~ --------------------编程问答-------------------- class Student : Person
  {
  public void work()
  {
  Console.WriteLine("我正在认真学习");
  }
  }

没有完全实现Person类 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 1 楼 wuyq11 的回复:
new 用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。  

Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名,……

既然“也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法”,那输出的结果应该是“我正在认真学习”啊,咋会是“我正在工作”呢?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,