C# override与new的区别

来源:互联网 发布:伊藤诚 知乎 编辑:程序博客网 时间:2024/05/20 05:23

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">override(重写):子类对父类中虚函数进行重写,相当于覆盖;</span>

new(隐藏):子类对父类中的函数进行隐藏。


为作验证建立以下几个类:

</pre><pre name="code" class="csharp">    public abstract class A    {        public virtual void Fun1()        {            Console.WriteLine("调用A类中的Fun1函数。");        }        public virtual void Fun2()        {            Console.WriteLine("调用A类中的Fun2函数。");        }    }
    public class B:A    {        public new void Fun1()        {            Console.WriteLine("调用B类中的Fun1函数。");        }        public override void Fun2()        {            Console.WriteLine("调用B类中的Fun2函数。");        }    }

    public class C:B    {        new public void Fun2()        {            Console.WriteLine("调用C类中的Fun2函数。");        }    }


一般的情况:子类声明构造子类的对象,如

<pre name="code" class="csharp">B man = new B():B.Fun1();B.Fun2();


显然,man中的Fun1方法调用的子类的重写方法,而Fun2方法调用的也是子类中的Fun2方法。


而另一种情况:父类声明构造子类的对象,如

<pre name="code" class="csharp">A Bman = new B();A Cman = new C();Bman.Fun1();Bman.Fun2();Cman.Fun1();Cman.Fun2();


此时,子类中重写的函数则会被调用;子类中用new隐藏的函数不会被调用,而调用父类中没被重写的函数。

如理,得以下输出结果:

调用A类中的Fun1函数。调用B类中的Fun2函数。调用A类中的Fun1函数。调用B类中的Fun2函数。


总结:

在父类声明 子类构造的对象中,若子类用override对父类方法进行重写,
则调用的是被重写的方法;

若子类用new对父类方法进行隐藏,
则调用的是父类被隐藏的方法。

0 0
原创粉丝点击