/*
*
第一次不使用this关键字的执行结果
--------------------
1.Parent
1.Child
1.ClassName:Child,MethodName:Test
--------------------
1.Parent
1.ClassName:Parent,MethodName:Test
--------------------
1.Parent
1.Child
1.ClassName:Parent,MethodName:Test
分析:代码的执行顺序
Child c = new Child();实例化Child对象时,先后调用Parent、Child的构造方法,当Parent与Child中有同名的方法时(如Test方法),则谁发起调用,则调用谁的方法,
这里由Child发起,则调用Child的Test方法;也可以这样理解,先从Child中查找Test方法,如果找到了则执行方法,如果未找到,则从Parent中找,
直到在根类中检索完毕,如果还是没找到,则编译报错或是运行时报错。
Parent p = new Parent();实例化Parent对象时,调用Parent的构造方法,接着调用Parent的Test方法,这不用解释了吧。
Parent pc = new Child();这里用子类实例化后赋给了父类对象,这行代码可转换成Parent pc = new Child() as Parent;这里先实例化Child对象,先后调用Parent、Child的构造方法,
然后把Child对象转换成Parent对象,再由Parent对象调用Test方法。
第二次调用,比较this.GetType().Name与method.ReflectedType.Name,执行结果
--------------------
1.Parent
2.Child
3.ClassName:Parent,MethodName:.ctor 、、构造方法
1.Child
2.Child
3.ClassName:Child,MethodName:.ctor 、、构造方法
1.ClassName:Child,MethodName:Test
2.ClassName:Child,MethodName:Test
3.ClassName:Child,MethodName:Test
--------------------
1.Parent
2.Parent
3.ClassName:Parent,MethodName:.ctor 、、构造方法
1.ClassName:Parent,MethodName:Test
2.ClassName:Parent,MethodName:Test
3.ClassName:Parent,MethodName:Test
--------------------
1.Parent
2.Child
3.ClassName:Parent,MethodName:.ctor 、、构造方法
1.Child
2.Child
3.ClassName:Child,MethodName:.ctor 、、构造方法
1.ClassName:Parent,MethodName:Test
2.ClassName:Child,MethodName:Test
3.ClassName:Parent,MethodName:Test
分析:对象
this指的是具体对象,当需要访问具体对象时可以用this,StackTrace使用的是堆栈回溯,可以得到运行时源码的信息、当前代码的行号,列号
关于this.GetType().Name与上下文类名不一致,this原本指向子类Child。
*/
class MainClass
{
public static void Main(string[] args)
{
string splits = new string('-', 20);
Console.WriteLine(splits);
Child c = new Child();
c.Test();
Console.WriteLine(splits);
Parent p = new Parent();
p.Test();
Console.WriteLine(splits);
Parent pc = new Child();
pc.Test();
//Child cp = new Parent() as Child;//报异常
//Child cp = new Parent() as Child;cp.Test();//cp=null,报异常,运行时错误
Console.ReadLine();
}
}
class Parent
{
public Parent()
{
Console.WriteLine("1.Parent");
//Console.WriteLine("2.{0}",this.GetType().Name);
//System.Reflection.MethodBase method = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod();
//Console.WriteLine("3.ClassName:{0},MethodName:{1}", method.ReflectedType.Name, method.Name);
}
public void Test()
{
Console.WriteLine("1.ClassName:Parent,MethodName:Test"); Test2();
//Console.WriteLine("2.ClassName:{0},MethodName:{1}",this.GetType().Name,new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name);
//System.Reflection.MethodBase method = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod();
//Console.WriteLine("3.ClassName:{0},MethodName:{1}", method.ReflectedType.Name, method.Name);
}
public void Test2() { }
}
class Child:Parent
{
public Child()
{
Console.WriteLine("1.Child");
//Console.WriteLine("2.{0}",this.GetType().Name);
//System.Reflection.MethodBase method = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod();
//Console.WriteLine("3.ClassName:{0},MethodName:{1}", method.ReflectedType.Name, method.Name);
}
public new void Test()//使用new关键字隐藏父类的Test,编译器不会报警
{
Console.WriteLine("1.ClassName:Child,MethodName:Test"); Test2();
//Console.WriteLine("2.ClassName:{0},MethodName:{1}", this.GetType().Name, new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name);
//System.Reflection.MethodBase method = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod();
//Console.WriteLine("3.ClassName:{0},MethodName:{1}", method.ReflectedType.Name, method.Name);
}
}