您的位置:首页 > 其它

对于new和override的理解

2009-04-15 18:28 260 查看
在成功的道路上,你没有耐心去等待成功的到来,那么,你只好用一生的耐心去面对失败。
Override 和 New :
在同一个声明中使用new和override修饰符是错误的。
隐藏一个继承成员并不被认为是错误的,但是会造成编译器给出警告。
为了禁止这个警告,派生类成员的声明可以包括一个new修饰符来指出派生成员要隐藏基成员。
eg: (注:此例摘自MSDN,但此例并没有具体说明new和override的区别)
* 假定公司 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: