问一个关键字 【 NEW 】 的简单问题

Dhoopu 2008-12-17 10:41:14
最近在 《你必须知道的.NET》中看到了 关键字 new、Override 的用法,有一点疑问,请大家指教……

代码如下:

using System;

namespace InsideDotNet.Keywords.New
{

class MyC
{
}

class Number
{
public static int i = 123;

public virtual void ShowInfo()
{
Console.WriteLine("base class---");
}

public virtual void ShowNumber()
{
Console.WriteLine(i.ToString());
}
}

class IntNumber : Number
{
new public static int i = 456;

public new virtual void ShowInfo()
{
Console.WriteLine("Derived class---");
}

public override void ShowNumber()
{
Console.WriteLine("Base number is {0}", Number.i.ToString());
Console.WriteLine("New number is {0}", i.ToString());
}
}

class Test_Number
{
public static void Main()//Main_6_1_1
{
Number num = new Number();
num.ShowNumber();
IntNumber intNum = new IntNumber();
intNum.ShowNumber();
intNum.ShowInfo();

Number number = new IntNumber();
//究竟调用了谁?
number.ShowInfo();
//究竟调用了谁?
number.ShowNumber();

}
}
}



问题如,代码中 红色显示。

还有个问题就是 关键字 new 和override 的本质上用法上有撒区别呢,请高手们给俺解释解释,谢谢。

...全文
285 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiang_jiajia10 2008-12-17
  • 打赏
  • 举报
回复
new 声明一个类的实例,也就是创建对象,然后通过对象来使用类内的成员和方法
override 重写同名函数
wsf205 2008-12-17
  • 打赏
  • 举报
回复
学习了
yulien 2008-12-17
  • 打赏
  • 举报
回复
顶一下,我是穷人,争点分
  • 打赏
  • 举报
回复
Number number = new IntNumber();
number.ShowInfo();调用父类的ShowInfo(),因为子类的ShowInfo()是子类独有的,不是继承下来的,只是函数名称和父类那个函数一样
new 的作用就是子类新定义的方法,只是名称和父类相同。用override是直正意义上的重载
number.ShowNumber();调用子类方法,
tangserver 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 claymore1114 的回复:]
引用 7 楼 HDNGO 的回复:
override重写虚方法,那么就只剩下重写以后的方法;
new隐藏基类的方法,那么基类的方法和当前类的方法同时存在只是被隐藏了;

正解
override是覆盖基类方法,基类的方法就不能访问了(也就是说被子类改了),就只能实现子类的方法。
new 其实基类、子类的方法都存在,通过子类的实例可以访问子类方法,通过基类实例可访问基类方法
[/Quote]

jefflovejava 2008-12-17
  • 打赏
  • 举报
回复
先说override,他的意思是说子类把父类的方法重写了,也就是覆盖了,子类的模板里已经没有父类的那个方法了。所以你用子类去实例化父类的时候,如果父类的实例调用了该方法名,那么调用的将是子类重写过的方法。
你的代码(用子类实例化父类)就是
Number number = new IntNumber();
number.ShowNumber();
至于输出是相应的
Console.WriteLine("Base number is {0}", Number.i.ToString());
Console.WriteLine("New number is {0}", i.ToString());
这段代码打印的内容。
用子类实例化子类的话
IntNumber intNum = new IntNumber();
intNum.ShowNumber();
输出的也会是
Console.WriteLine("Base number is {0}", Number.i.ToString());
Console.WriteLine("New number is {0}", i.ToString());
这段代码打印的内容。


而new,他的意思是说,父类的方法,我不动它,我会重新建立一个方法,和父类的方法的签名是一样的,而对于外界来说子类把父类的同名方法给隐藏了,也就是说父类的那个方法还是在类模板里存在的,子类有重新写了一个新的方法,并把父类的那个1方法隐藏了。
你的代码(子类实例化父类)就是
Number number = new IntNumber();
number.ShowInfo();
输入结果应该是
Console.WriteLine("base class---");
这段代码打印的内容
而如果用子类实例化子类的话
IntNumber intNum = new IntNumber();
intNum.ShowInfo();
输入的将是
Console.WriteLine("Derived class---");
这段代码输出的内容。

claymore1114 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 HDNGO 的回复:]
override重写虚方法,那么就只剩下重写以后的方法;
new隐藏基类的方法,那么基类的方法和当前类的方法同时存在只是被隐藏了;
[/Quote]
正解
override是覆盖基类方法,基类的方法就不能访问了(也就是说被子类改了),就只能实现子类的方法。
new 其实基类、子类的方法都存在,通过子类的实例可以访问子类方法,通过基类实例可访问基类方法
Dhoopu 2008-12-17
  • 打赏
  • 举报
回复
楼上各位的回复都让鄙人受益匪浅,谢谢各位啦~
lintf1986 2008-12-17
  • 打赏
  • 举报
回复
这个说得很清楚了[Quote=引用 11 楼 symbol441 的回复:]
关键字 new 和override 的本质上用法上有撒区别呢

-->
new关键字只会影响到当前类对象实例。对基类对象不产生影响
在楼主的实例中他就只是会对IntNumber intNum 这个实例产品影响,然而对(基类)Number num 不会有影响

override也叫重写,他是派生类对基类方法的一个重写,但他是想象中那样直接影响到基类方法
只有当使用派生类去实例化基类的时候才会影响
即Number num =new Number()这样是不会受override方法影…
[/Quote]
郭军 2008-12-17
  • 打赏
  • 举报
回复
这个根据CLR对虚方法和实例方法的调度机制上比较好理解。首先要说明的是CLR已经在托管堆中初始化了两块内存,用于存储Number类型对象和IntNumber类型对象,其中存放的是方法和静态字段的代码。
Number number = new IntNumber();//这计划构造了一个number实例对象,CLR在内存中分配一块内存用于存放number,number的类型对象指针却是指向IntNumber类型对象的。
//如果调用number的实例方法的话,number实例对象不会管类型对象指针,直接调用Number类型对象中的方法。
//如果是调用virtual方法并且子类中重载了(override)的话,number实例对象会取得类型对象指针,调用它的实际类型中的方法。这就解释了number.ShowNumber()是调用的IntNumber中的方法。
//如果使用了New关键字,就表示子类中的ShowInfo方法和基类中的showInfo方法没有关系,因此它不会查找类型对象指针,直接调用Number中的方法
路人乙e 2008-12-17
  • 打赏
  • 举报
回复
new 声明一个类的实例,即,把一个抽象的类具体化
override 重写同名函数(可理解为覆盖原有函数)
wuyq11 2008-12-17
  • 打赏
  • 举报
回复
new关键字跟继承没有关系,可以用在一个类的子类。当子类的一个方法用到new(这个方法可以和基类的一个方法同名,也可以不同),调用的时候会运行基类的同名方法,而不会调用子类有new关键字的方法;override只是在继承的时候才会用到,用在子类要覆盖基类方法的方法。当一个子类的方法用到override 关键字,在调用的时候会运行子类中相应的方法
。class A
{
public virtual void Test()
{
Console.WriteLine("A");
}
}

class A1 : A
{
public override void Test()
{
Console.WriteLine("A1");
}
}

class A2 : A
{
public new void Test()
{
Console.WriteLine("A2");
}
}

class Test
{
static void Main(string[] args)
{
A a1 = new A1();
A a2 = new A2();

a1.Test();
a2.Test();
(a2 as A2).Test();

Console.Read();
}
}

输出结果是:

A1
A
A2
wanghui0380 2008-12-17
  • 打赏
  • 举报
回复
new 就是指鹿为马 ,实际鹿还是鹿,马还是马,只是你非要把鹿叫做马而已
override 是偷梁换柱,“梁”已经不在了,现在只有“柱”
justindreams 2008-12-17
  • 打赏
  • 举报
回复
我发现我说错了,new那个应该是执行Console.WriteLine("base class---"),其他的都隐藏,唉,基础知识啊

这样子的Number number = new IntNumber();
number.ShowInfo();
因为numberShowInfo()调用的是Number类里面的ShowInfo方法,其他的都隐藏掉了
flyjimi 2008-12-17
  • 打赏
  • 举报
回复
在子类中new的方法,调用时执行声明的类型的方法。
在子类中override的方法,调用时执行实例化的类型的方法。
在楼主的例子中ShowInfo是new,ShowNumber是override。

看代码:
Number num = new Number();
num.ShowNumber();
IntNumber intNum = new IntNumber();
intNum.ShowNumber();

Number number = new IntNumber();
number.ShowNumber();

上面3种调用ShowNumber,看等号右边,实例化的是什么类型。

同样的:
Number num = new Number();
num.ShowInfo();
IntNumber intNum = new IntNumber();
intNum.ShowInfo();

Number number = new IntNumber();
number.ShowInfo();

上面3种调用ShowInfo,看等号左边,声明的是什么类型。



symbol441 2008-12-17
  • 打赏
  • 举报
回复
关键字 new 和override 的本质上用法上有撒区别呢

-->
new关键字只会影响到当前类对象实例。对基类对象不产生影响
在楼主的实例中他就只是会对IntNumber intNum 这个实例产品影响,然而对(基类)Number num 不会有影响

override也叫重写,他是派生类对基类方法的一个重写,但他是想象中那样直接影响到基类方法
只有当使用派生类去实例化基类的时候才会影响
即Number num =new Number()这样是不会受override方法影响的
只有Number num =new intNumber()时。基类对象就会去调用基类override以后的方法


happychou 2008-12-17
  • 打赏
  • 举报
回复
学习了........
watson110 2008-12-17
  • 打赏
  • 举报
回复
new 就是他爹的东西都拿过来
override就是他爹的东西他都不要,就要自己的。
--经典
caihaosheng012 2008-12-17
  • 打赏
  • 举报
回复
你问的这个问题就是关于隐藏基类方法问题~!
一旦类A的CHS方法被类B重新NEW了(即重写了基类A的CHS方法)~!那么
A KK=NEW A();
KK.CHS;//此时就还是调用A的CHS方法;
B JJ=NEW B();
KK=JJ;
JJ.CHS;//此时调用的是被B重写的CHS方法;
KK.CHS;//此时调用的是被B重写的CHS方法;

(记得给分)
HDNGO 2008-12-17
  • 打赏
  • 举报
回复
override重写虚方法,那么就只剩下重写以后的方法;
new隐藏基类的方法,那么基类的方法和当前类的方法同时存在只是被隐藏了;
加载更多回复(10)

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧