类的多态性


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

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

转载于:https://www.cnblogs.com/fengjiulin110120/p/6616606.html

某公司的员工有经理Manager、技术人员Technicist和营销人员SalsePerson,他们的薪金计算方法如下: 经理按月计酬,方法是:基本工资+奖金;技术人员按月计酬,方法是:基本工资;营销人员按月计酬,方法是:基本工资+销售利润*5%。 每人员都有职工编号、姓名、性别、入职时间、职位、基本工资等数据,其中为入职时间定义Date,并为该重载运算符<<,实现入职时间的输入;各人员使用统一接口getpay()计算各人员的月薪。其次,设计一个统计并输出该公司每个人员某几个月薪金情况的报表Report,该提供add接口向Report的容器中添加员工信息,并提供print接口用于输出每个员工的职工编号、姓名、性别、入职时间、职位和在设定的月份时间段中该员工的薪酬总额。为了方便实现查找功能,为Report重载[]运算符的功能,下标值为职位,能根据职位信息查找出所有符合该职位的员工,并重载print接口,输出查找出的员工信息,信息包括职工编号、姓名、性别、入职时间、职位、基本工资。在主函数中对实现的进行测试,首先,创建各人员对象,通过Report的add接口向报表中添加这些人员信息,然后通过Report的print接口输出报表。其次测试报表的查找功能,输入要查找的员工职位信息,通过Report的print接口输出查找到的员工基本信息报表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值