• 类的多态性



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

            //    当派生类从基类继承时,它会获得积累的所有方法,字段,属性,和事件.派生类可以选择:
                //    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 ("我是茶,我可以解渴");
            }
        }

  • 相关阅读:
    BZOJ 2594: [Wc2006]水管局长数据加强版
    BZOJ 2049: [Sdoi2008]Cave 洞穴勘测
    html5 canvas ( 贝塞尔曲线, 一片星空加绿地 ) quadraticCurveTo, bezierCurveTo
    c#.net 接收 base64 格式的数据并解析为图片
    html5 canvas ( 绘制一轮弯月, 星空中的弯月 )
    html5 canvas ( 圆和切点曲线的绘制 ) arc, arcTo
    html5 canvas ( 图片填充样式 ) fillStyle, createPattern
    html5 canvas ( 径向渐变, 升级版的星空 ) fillStyle, createRadialGradient
    html5 canvas ( 线性渐变, 升级版的星空 ) fillStyle, createLinearGradient, addColorStop
    html5 canvas ( 图形变换矩阵 ) transform, setTransform
  • 原文地址:https://www.cnblogs.com/fengjiulin110120/p/6616606.html
Copyright © 2020-2023  润新知