最近在 《你必须知道的.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 的本质上用法上有撒区别呢,请高手们给俺解释解释,谢谢。
{ 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 的本质上用法上有撒区别呢,请高手们给俺解释解释,谢谢。
override就是他爹的东西他都不要,就要自己的。
先调Number,
IntNumber intNum = new IntNumber();
先调Number,
再调IntNumber
Number number = new IntNumber();
[color=#FF0000] //究竟调用了谁?
number.ShowInfo();
//究竟调用了谁?调用了IntNumber
//究竟调用了谁?
number.ShowInfo();------------这个先调用父类的ShowInfo方法Console.WriteLine("base class---"),在调用自己的ShowInfo方法里面的内容Console.WriteLine("Derived class---");
//究竟调用了谁?
number.ShowNumber();------------这个因为子类里面用了override,所以直接调用子类中的内容
Console.WriteLine("Base number is {0}", Number.i.ToString());
Console.WriteLine("New number is {0}", i.ToString());
new隐藏基类的方法,那么基类的方法和当前类的方法同时存在只是被隐藏了;
一旦类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方法;(记得给分)
override就是他爹的东西他都不要,就要自己的。
--经典
new关键字只会影响到当前类对象实例。对基类对象不产生影响
在楼主的实例中他就只是会对IntNumber intNum 这个实例产品影响,然而对(基类)Number num 不会有影响override也叫重写,他是派生类对基类方法的一个重写,但他是想象中那样直接影响到基类方法
只有当使用派生类去实例化基类的时候才会影响
即Number num =new Number()这样是不会受override方法影响的
只有Number num =new intNumber()时。基类对象就会去调用基类override以后的方法
在子类中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,看等号左边,声明的是什么类型。
number.ShowInfo();
因为numberShowInfo()调用的是Number类里面的ShowInfo方法,其他的都隐藏掉了
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
override 重写同名函数(可理解为覆盖原有函数)
Number number = new IntNumber();//这计划构造了一个number实例对象,CLR在内存中分配一块内存用于存放number,number的类型对象指针却是指向IntNumber类型对象的。
//如果调用number的实例方法的话,number实例对象不会管类型对象指针,直接调用Number类型对象中的方法。
//如果是调用virtual方法并且子类中重载了(override)的话,number实例对象会取得类型对象指针,调用它的实际类型中的方法。这就解释了number.ShowNumber()是调用的IntNumber中的方法。
//如果使用了New关键字,就表示子类中的ShowInfo方法和基类中的showInfo方法没有关系,因此它不会查找类型对象指针,直接调用Number中的方法
override是覆盖基类方法,基类的方法就不能访问了(也就是说被子类改了),就只能实现子类的方法。
new 其实基类、子类的方法都存在,通过子类的实例可以访问子类方法,通过基类实例可访问基类方法
你的代码(用子类实例化父类)就是
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---");
这段代码输出的内容。
number.ShowInfo();调用父类的ShowInfo(),因为子类的ShowInfo()是子类独有的,不是继承下来的,只是函数名称和父类那个函数一样
new 的作用就是子类新定义的方法,只是名称和父类相同。用override是直正意义上的重载
number.ShowNumber();调用子类方法,
override 重写同名函数