using System;
using System.Collections.Generic;
using System.Text;
namespace 类的继承问题01
{
class Program
{
static void Main(string[] args)
{
//A Aa = new A();
//Aa.BaseMethod(); //调用自身的方法,即调用A类中的BaseMethod()方法
B Ba = new B();
A Aa = Ba; //隐式转换,或者是上强制类型转换
Aa.BaseMethod(); //多态,调用B类中重写的BaseMethod()方法
//B Ba = new B();
//Ba.BaseMethod(); //调用自身的方法,即调用B类中的BaseMethed()方法
//B Ba = new B();
//A Aa = Ba;
//Ba = (B)Aa; //强制类型转换,Aa必须满足:Aa的实际类型必须是B或者是继承自B的类的类型
//Ba.BaseMethod(); //调用自身的方法,即调用B类中的BaseMethed()方法
//C Ca = new C();
//B Ba = Ca;
//Ca = (C)Ba; //强制类型转换,Ba必须满足:Ba的实际类型必须是C或者是继承自C的类的类型
//Ca.BaseMethod(); //调用自身的方法,即调用C类中的BaseMethed()方法
//C Ca = new C();
//A Aa = Ca;
//Ca = (C)Aa; //强制类型转换,Aa必须满足:Aa的实际类型必须是C或者是继承自C的类的类型
//Ca.BaseMethod(); //调用自身的方法,即调用C类中的BaseMethed()方法
// D Da = new D();
// A Aa = Da;
// C Ca;
在整个这一小代码段里可以换成 C Ca = new C();
// Ca = (C)Aa; //强制类型转换,Aa必须满足:Aa的实际类型必须是C或者是继承自C的类的类型
// Ca.BaseMethod(); // ?多态 最后调用的是D类中的BaseMethed()方法,原因是Aa的实际类型是D
//C Ca = new C();
//B Ba = new B();
//A Aa = Ba;
//Ca = (C)Aa; //这里会发生异常,原因是Aa的实际类型是B,而现在是想把Aa强制转换为C,而C是从B 派生的
//Ca.BaseMethod();//所以会发生异常
//C Ca = new C();
//B Ba = new B(); //在整个这一小代码段里可以换成B Ba;
//A Aa = Ca;
//Ba = (B)Aa;
//Ba.BaseMethod();//?多态 最后调用的是C类中的BaseMethed()方法,原因是Aa的实际类型是C
//C Ca = new C();
//B Ba = Ca; //隐式转换,或者是上强制类型转换
//Ba.BaseMethod(); //多态调用C类中重写的BaseMethod()方法
//C Ca = new C();
//A Aa = Ca; //隐式转换,或者是上强制类型转换
//Aa.BaseMethod(); //多态调用C类中重写的BaseMethod()方法
//C Ca = new C();
//Ca.BaseMethod(); //调用自身的方法,即调用C类中的BaseMethed()方法
Console.ReadKey();
}
}
class A
{
public virtual void BaseMethod()
{
Console.WriteLine("ABaseMethod");
}
}class B:A
{
/* B类中被重写的BaseMethod()方法在B类的各级后代类里仍将是一个virtual方法,就是说你可以在B类的后代类中再次重写这个方法,例如C类中的BaseMethod()方法 */
public override void BaseMethod()
{
Console.WriteLine("BBaseMethod");
}
}
class C:B
{
public override void BaseMethod()
{
Console.WriteLine("CBaseMethod");
}
}
class D : C
{
public new void BaseMethod() //在这里可以通过new隐藏基类C中的public override void BaseMethod(){.....}方法
{
Console.WriteLine("DBaseMethod");
}
}
}
// 保留子new可以和vietual一起用,但不能和override一起用