黑马程序员技术交流社区

标题: override的疑问 [打印本页]

作者: 许正龙    时间: 2013-3-26 09:15
标题: override的疑问
本帖最后由 许正龙 于 2013-3-27 09:39 编辑

如果父类中的方法没有用virtual来修饰,那么子类中重写用override和不用override有什么区别呢。还有比如类A有一个Help的虚方法,类B继承类A,而且重写了此方法,那么类C继承类B,它还能重写这个Help方法么?
作者: 邓建军    时间: 2013-3-26 13:24
override 方法提供从基类继承的成员的新实现。 由 override 声明重写的方法称为重写基方法。 重写的基方法必须与 override 方法具有相同的签名。
不能重写非虚方法或静态方法。 重写的基方法必须是 virtual、abstract 或 override 的。
override 声明不能更改 virtual 方法的可访问性。 override 方法和 virtual 方法必须具有相同的访问级别修饰符。
您不能使用 new、static 或 virtual 修饰符来修改 override 方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。

有关如何使用 override 关键字的更多信息,请参见使用 Override 和 New 关键字进行版本控制(C# 编程指南)和了解何时使用 Override 和 New 关键字
作者: 许正龙    时间: 2013-3-26 13:28
邓建军 发表于 2013-3-26 13:24
override 方法提供从基类继承的成员的新实现。 由 override 声明重写的方法称为重写基方法。 重写的基方法 ...

谢谢科普,但是刚刚的实例类C中还可以重写Help方法么?
作者: 邓建军    时间: 2013-3-26 14:10
许正龙 发表于 2013-3-26 13:28
谢谢科普,但是刚刚的实例类C中还可以重写Help方法么?

可以,但不能加override关键字
作者: 杞文明    时间: 2013-3-26 19:04
那样的话 就不能实现多态了! 子类中的Help方法会隐藏了父类中的Help方法
也就说在子类中他就是一个全新的方法! 不能实现多态!

作者: 曾玉锋    时间: 2013-3-26 19:35
class Program
    {
        static void Main(string[] args)
        {

            //p1 p = new p1(); p.Show();//输出p1.Show();
            //p1 p = new p2();p.Show()输出p2.Show();
            //p1 p = new p3();p.Show()//输出p3.Show();
            
            //而子类用new关键字隐藏了父类的普通方法
            p2 p = new p2();
            p.Write();//输出这是p2的普通方法
            p2 p2 = new p3();
            p2.Write();//还是输出这是p2的普通方法
            //请注意:
            p3 p3 = new p3();
            p3.Write();//这里输出的是p3里面用new关键字隐藏的方法p3.Write();
            //调用子类用New关键字修饰(new 可隐藏)的父类普通方法,看=号左边的是子类还是父类,
            //如果是=号左边是父类,则调用父类的方法,如果是子类,则调用子类的方法。
            Console.ReadKey();
        }
    }
    class p1
    {
        public virtual void Show()
        {
            Console.WriteLine("这是p1.Show()");
        }
    }
    class p2 : p1
    {
        public override void Show()
        {
            Console.WriteLine("这是p2重写p1.Show()");
        }
        public void Write()
        {
            Console.WriteLine("这是p2的普通方法");
        }
    }
    class p3 : p2
    {
        public override void Show()
        {
            Console.WriteLine("这是重写的p2.Show()");
        }
        public void Write()
        {
            Console.WriteLine("这是p2的方法,该方法与p2.Write()重名,是p3默认用new关键字修饰的方法,不是方法重写,而是隐藏父类的Write()");
        }
    }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2