对于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
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
相关文章推荐
- 说说我理解的override和new的区别
- 简述对new,virture 和override关键字的理解
- 如何理解C# 多态中的override和new
- 说说我理解的override和new的区别
- 深入理解virtual/new/override 这些关键字的意义
- 我理解c#中的interface abstract virtual override和new
- 说说我理解的override和new的区别
- 理解c#中的interface abstract virtual override和new(转)
- 对于 A a = new A(); 的一些理解
- 我理解c#中的interface abstract virtual override和new(转)
- c#中关于virtual,override和new的理解
- 【KK学习笔记】c# 虚方法 virtual 、 重写方法 override 、new 的使用与理解
- 对于 子类和基类中 方法的重写 override 和覆盖 new
- C#中的Virtual、Override和new关键词理解
- 深入理解C#中new、override、virtual关键字的区别
- new和override的区别(自我理解)
- 如何理解C# 多态中的override和new
- 对于C++保护继承方式的一点理解
- Unix学习笔记-----对于守护进程的一些理解
- 关于对于spring当中一些基础概念的理解