对于new和override的理解

来源:互联网 发布:成功瘦身知乎 编辑:程序博客网 时间:2024/04/29 15:20

在成功的道路上,你没有耐心去等待成功的到来,那么,你只好用一生的耐心去面对失败。

      Override New

      在同一个声明中使用newoverride修饰符是错误的。

      隐藏一个继承成员并不被认为是错误的,但是会造成编译器给出警告。

      为了禁止这个警告,派生类成员的声明可以包括一个new修饰符来指出派生成员要隐藏基成员。

      eg:  (注:此例摘自MSDN,但此例并没有具体说明newoverride的区别)

  假定公司 A 创建了一个名为 A 的类,您的程序使用该类:

      class A

      {

          public virtual void DrawLine() { }

          public virtual void DrawPoint() { }

      }

  您的公司使用此类,并且您在添加新方法时将其用来派生自己的类:

      class B : A

      {

          public void DrawRectangle() { }

      }

  您在应用程序的使用过程中没有遇到任何问题,

      直到公司 A 发布了 A 的新版本,该新版本类似如下:

      class A

      {

          public virtual void DrawLine() { }

          public virtual void DrawPoint() { }

          public virtual void DrawRectangle() { }

      }

  现在,一旦使用 A 的新版本重新编译应用程序,

      您将收到来自编译器的警告(不会产生错误)

      如果想用您的方法重写新的基类方法,请使用 override 关键字

      class B : A

      {

        public override void DrawRectangle() { }

      }

      override 关键字可确保B 的任何对象

      都将使用 DrawRectangle 的派生类版本。

  B的对象仍可以使用 base 关键字访问 DrawRectangle 的基类版本。

      base.DrawRectangle();

  或者,也可以通过在派生类定义中使用关键字 new 来防止出现该警告

      class B : A

      {

        public new void DrawRectangle() { }

      }

  使用 new 关键字告诉编译器您的定义将隐藏基类中包含的定义。

      new成员的声明只是在new成员的范围内隐藏继承的成员。

下面具体说明new override的区别

using System;

namespace N

{

    class A

    {

        public void F()

        {

            Console.WriteLine("A");

        }

    }

    class B : A

    {

        public new void F()

        {

            Console.WriteLine("B");

        }

    }

    class C

    {

        static void Main()

        {

            A a = new A();

            B b = new B();

            A bb = new B();

            a.F();

            b.F();

            bb.F();

            Console.ReadLine();

        }

    }

}

结果: A

       B

       A

B中的方法用了new后,以 B b = new B();方式得到的对象b调用了方法F,产生的结果是B

但以A bb = new B();方式得到的对象bb掉用方法F后,产生的结果是A

 

 

 

 

 

using System;

namespace N

{

    class A

    {

        public virtual void F()

        {

            Console.WriteLine("A");

        }

    }

    class B : A

    {

        public override void F()

        {

            Console.WriteLine("B");

        }

    }

    class C

    {

        static void Main()

        {

            A a = new A();

            B b = new B();

            A bb = new B();

            a.F();

            b.F();

            bb.F();

            Console.ReadLine();

        }

    }

}

结果:A

      B

      B

B中的方法用了override后,以 B b = new B();方式得到的对象b调用了方法F,产生的结果还是B

A bb = new B();方式得到的对象bb掉用方法F后,产生的结果却变成了B

 

原创粉丝点击