using System;namespace TestWinForm
{
/// <summary>
/// MainClass 的摘要说明。
/// </summary>
public class MainClass
{
public class A
{
public void printA()
{
System.Diagnostics.Debug.WriteLine("printA");
} public virtual void valueA()
{
System.Diagnostics.Debug.WriteLine("ValueA");
}
} public class B:A
{
new public void printA()
{
System.Diagnostics.Debug.WriteLine("printB");
} public override void valueA()
{
System.Diagnostics.Debug.WriteLine("ValueB()");
} } private static void Main()
{
B BTemp=new B();
A ATemp=BTemp;
ATemp.printA(); //printA
ATemp.valueA(); //ValueB
BTemp.printA(); //printB --->结果.
BTemp.valueA(); //ValueB
}
}
}我不明白.ATemp.printA(); 这输出结果为什么是printAA ATemp = BTemp;这句不是ATemp指向BTemp吗..
ATemp.printA();方法不是就是BTemp.printA()吗.
即结果为:printB吗... ATemp.valueA(); //ValueB
这个结果证明ATemp指向BTemp吧...我不知道我那里分析错了...???
{
/// <summary>
/// MainClass 的摘要说明。
/// </summary>
public class MainClass
{
public class A
{
public void printA()
{
System.Diagnostics.Debug.WriteLine("printA");
} public virtual void valueA()
{
System.Diagnostics.Debug.WriteLine("ValueA");
}
} public class B:A
{
new public void printA()
{
System.Diagnostics.Debug.WriteLine("printB");
} public override void valueA()
{
System.Diagnostics.Debug.WriteLine("ValueB()");
} } private static void Main()
{
B BTemp=new B();
A ATemp=BTemp;
ATemp.printA(); //printA
ATemp.valueA(); //ValueB
BTemp.printA(); //printB --->结果.
BTemp.valueA(); //ValueB
}
}
}我不明白.ATemp.printA(); 这输出结果为什么是printAA ATemp = BTemp;这句不是ATemp指向BTemp吗..
ATemp.printA();方法不是就是BTemp.printA()吗.
即结果为:printB吗... ATemp.valueA(); //ValueB
这个结果证明ATemp指向BTemp吧...我不知道我那里分析错了...???
------------------------------------
好像是这样哦...
A ATemp = new B();
ATemp.printA();
由于printA()并不是一个虚方法,而且在B中是这样定义的new public void printA(){},这个new的意思是说这个方法是专属于类B的,和类A一点关系都没有
ATemp.printA();也绝对不等价于BTemp.printA(); ATemp只是一个对象的引用,并不是真正的一个对象,由于派生类的对象总是可以看做是一个基类对象,所以A ATemp = new B(); 这句话是成立的,但并不代表ATemp就是B类的对象!
对于第二种情况
ATemp.valueA();只所以出来的结果是ValueB,那是因为B中是这样定义的public override void valueA(){},override代表子类覆盖了父类的方法,但ATemp仍是个指向基类的对象的引用,当有和父类同名且参数列表相同的方法时,会调用子类的方法,这也正是面向对象编程多态的特征,但不代表ATemp是B类的对象,不然你在B类随便试试加一个方法,看看ATemp是否能调用这些概念建议楼主多看看相关的书籍吧
B BTemp=new B();
A ATemp=BTemp;
ATemp.printA();
我还是不很明白为什么ATemp.printA()调用的printA()不是BTemp中的printA()
B是A的子类..
A ATemp=BTemp;
ATemp.printA();
不是等同于
BTemp.printA();吗。。
A ATemp
B BTemp
它们不是同一类型。你那样(A Atemp=new B)并不是把B的引用给A。而是把B转换为A。
我最后把那个NewPrintA方法加到A中就没出错了。我认为这样理解更好点,不知道是不是对的。我认为那样的面试题是看你会不会让表面现像迷惑。