题目如下,请问程序输出是什么?并解释
class Program
{
static void Main(string[] args)
{
TestA((A)new B());
TestB((B)new B());
Console.Read();
}
static void TestA(A a)
{
a.Method1("100");
a.Method2();
a.Method3();
}
static void TestB(B b)
{
b.Method1(100);
b.Method2();
b.Method3();
}
}
class A
{
public virtual void Method1(object obj)
{
Console.WriteLine("A Do Object");
}
public virtual void Method2()
{
Console.WriteLine("A Do 2");
}
public virtual void Method3()
{
Console.WriteLine("A Do 3");
}
}
class B : A
{
public void Method1(string str)
{
Console.WriteLine("B Do String");
}
public override void Method2()
{
Console.WriteLine("B Do 2");
}
public new void Method3()
{
Console.WriteLine("B Do 3");
}
}
A Do Object ;A Do 2;A Do 3 //这三个是Object 类型的
A Do Object ;A Do 2;A Do 3 //这三个是String类型的
virtual才能在继承类中override吧。否则同名的函数会被继承类覆盖的。要想不覆盖,需要在继承类的方法添加new关键字。
virtual,override,new你首先应该了解这几个关键字的用法。
virtual 同意背重载。
override 同意父类重载,也同意子类重载。
new 跟子类无关。
这个主要涉及到调用虚方法的情况:
1 TestA((A)new B());
1 static void TestA(A a)
2 {
3 a.Method1("100");
4 a.Method2();
5 a.Method3();
6 }
TestA调用时参数是(A)new B(),然后是调用A类的三个虚方法。调用虚方法时会检查发出调用的那个对象(就是new B())的方法表,如果找不到,就一直回溯到Object类。
而B类中只有方法二是对A类虚方法的重写。所以就会:
看看!