using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication13
{
class Program
{
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;//对静态字段也声明为new?
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()); //调用的是当前的静态字段
}
}
static void Main(string[] args)
{
//Number num = new Number();
//num.ShowNumber();//调用父类的静态字段 123
//IntNumber intnum = new IntNumber();
//intnum.ShowNumber();//调用子类对父类的重载方法,会显示子类的方法 123 456
//intnum.ShowInfo();
Number number = new IntNumber();
number.ShowInfo();//
number.ShowNumber();
}
}
}
什么是隐藏,我老是不懂,现在懂了。
在子类new一个对象的时候,如本例的intNumber ,它里面的
public new virtual void ShowInfo()
{
Console.WriteLine("Derived class----");
}
这个方法,如图所示,会在子类中,新生成一个方法对象 ,而原来的
public new virtual void ShowInfo()
{
Console.WriteLine("base class----");
}
会被隐藏,这里的隐藏,不是覆盖,子类并没有对父类的ShowInfo方法,进行修改,
只不过是,子类对外显示的时候,貌似只看到子类的showinfo()方法,
当我们的引用类型是子类的时候,方法指针指向 子类中的方法
当引用类型是父类的时候,方法指针指向父类中的方法,所以就会显示父类的方法了。
对于,覆盖和隐藏,最关键的是,把握好,在内存的分配情况