类的多态性


            //    类的多态
            //    多态就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型的不同完成方法不同的具体实现

        //    当派生类从基类继承时,它会获得积累的所有方法,字段,属性,和事件.派生类可以选择:
            //    1.继承最接近的基类方法而不是重写它
            //    2.重写基类中的虚拟成员.
            //    3.定义隐藏类实现的成员的新非虚实现

            //    实现多态的方法:   1.虚方法 :将父类的方法标记为虚方法,使用关键字virtual,此方法可以在子类中可以重写(重写使用关键字override)
            //                    2.抽象类和抽象方法:如果我们不需要使用父类创建对象,它的存在只是为了供子类继承.可以将父类写成抽象类(关键字abstract)
            //        将父类方法写成抽象方法,子类中的方法仍然用关键字override重写;
            //                    3. 接口实现;

            //    抽象类: 不需要使用基类实例化的对象;
            //    虚方法: 需要使用基类实例化的对象;

            //    我们选择使用虚方法实现多态还是抽象类抽象方法实现多态,取决于我们是否需要使用基类实例化的对象

            Clerk myClerk = new Clerk ();  //  new 创建一个对象
            ProjectManager myPm = new ProjectManager ();
            Clerk[] clerk = { myClerk, myPm };        //    用数组调用
            foreach (Clerk outclerk in clerk) 
                outclerk.WorkPlan();

    // 错误写法      Drink myMilk = new Drink ();        抽象类是不允许创建实例的

            Drink myMilk = new Milk ();        //    必须用子类来调用
            Drink myTea = new Tea ();
            Drink [] drink={myMilk,myTea};
            foreach (Drink outdrink in drink) 
                outdrink.drink();

            Console.ReadKey ();
        }
    }
     //    实例1:    职员需要有工作计划,经理也需要有工作计划
    //    分析:  现在有一个Cleck类作为父类, ProjectManager 类继承自Cleck, 因为需要父类创建的对象,所以用虚方法来实现多态

    //    虚方法:
    class Clerk{
        public virtual void WorkPlan(){        //声明虚方法
            Console.WriteLine ("我是职员,我需要有工作计划");
        }
    }

    class ProjectManager:Clerk{
        public override void WorkPlan(){        //    重写基类方法
            Console.WriteLine ("我是项目经理,我也需要有工作计划");
        }
    }

    //    实例2:  茶可以解渴,牛奶也可以解渴;        

  //     分析: 没有基类  所以需要从新声明一个基类  drink;
    //          tea 和 milk都是属于Drink类, 而我们需要使用milk和tea创建的对象,而根本不需要使用Drink创建的对象,所以可以使用抽象类抽象方法 

    // 抽象方法:

    abstract class Drink{    //  创建一个名为Drink的父类
        public abstract void drink();
        //利用抽象来实现类抽象化,然后方法抽象化,方法中不能有方法体;

//        {
//            Console.WriteLine ("我是饮料,可以解渴");
//        }
    }
 class Milk:Drink{  //  创建一个Milk的子类,继承与Drink父类
        public override void drink(){        //    重写
            Console.WriteLine ("我是牛奶,我可以解渴");
        }
    }

    class Tea:Drink{  //  创建一个Tea的子类,继承与Drink父类
        public override void drink(){
            Console.WriteLine ("我是茶,我可以解渴");
        }
    }

posted @ 2017-03-25 11:34  不思量自难忘  阅读(305)  评论(0编辑  收藏  举报