多态性,简单的说就是“一个接口,多个方法”,具体表现为相同的方法签名代表不同的方法实现,同 一操作作用于不同的对象,产生不同的执行结果。在.NET 中,覆写实现了运行时的多态性,而重载 实现了编译时的多态性。 运行时的多态性,又称为动态联编,通过虚方法的动态调度,在运行时根据实际的调用实例类型决定 调用的方法实现,从而产生不同的执行结果。class Base { public virtual void MyFunc(string str) { Console.WriteLine("{0} in Base", str); } } class Derived: Base { //覆写基类成员 public override void MyFunc(string str) { Console.WriteLine("{0} in Derived", str); } public static void Main() { Base B = new Base(); B.MyFunc("Hello"); Derived A = new Derived(); B = A; B.MyFunc("Morning"); } } 从结果中可知,对象B 两次执行B.MyFunc 调用了不同的方法,第一次调用基类方法MyFunc,而 第二次调用了派生类方法MyFunc。在执行过程中,对象B 先后指向了不同的类的实例,从而动态调 用了不同的实例方法,显然这一执行操作并非确定于编译时,而是在运行时根据对象B 执行的不同类 型来确定的。我们在此不分析虚拟方法的动态调度机制,而只关注通过虚方法覆写而实现的多态特性,
一操作作用于不同的对象,产生不同的执行结果。在.NET 中,覆写实现了运行时的多态性,而重载
实现了编译时的多态性。
运行时的多态性,又称为动态联编,通过虚方法的动态调度,在运行时根据实际的调用实例类型决定
调用的方法实现,从而产生不同的执行结果。class Base
{
public virtual void MyFunc(string str)
{
Console.WriteLine("{0} in Base", str);
}
}
class Derived: Base
{
//覆写基类成员
public override void MyFunc(string str)
{
Console.WriteLine("{0} in Derived", str);
}
public static void Main()
{
Base B = new Base();
B.MyFunc("Hello");
Derived A = new Derived();
B = A;
B.MyFunc("Morning");
}
}
从结果中可知,对象B 两次执行B.MyFunc 调用了不同的方法,第一次调用基类方法MyFunc,而
第二次调用了派生类方法MyFunc。在执行过程中,对象B 先后指向了不同的类的实例,从而动态调
用了不同的实例方法,显然这一执行操作并非确定于编译时,而是在运行时根据对象B 执行的不同类
型来确定的。我们在此不分析虚拟方法的动态调度机制,而只关注通过虚方法覆写而实现的多态特性,
例如:
1-11-111
112
113
2-11-111
112
我想把处于第三层的项目数量统计出来,怎么实现? 上例中应该是5