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一起用