zoukankan      html  css  js  c++  java
  • C#中 类的多态

    • 在类的继承中,C#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,

        也就是说在基类与派生类的相同功能中可以有不同的实现方法,从而为解决同一问题提供多种途径。

    • 多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型的不同完成方法不同的具体实现
    • 在C#中可以通过多种途径实现多态性:

    1. 虚方法:将父类的方法标记为虚方法,使用关键字virtual,此方法在子类中可以重写(使用关键字override)

    2. 抽象类与抽象方法:如果我们不需要使用父类创建对象,它的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类的方法写成抽象方法,子类中的方法仍用关键字override重写。

    3. 接口实现:
    • 我们选择使用虚方法实现多态还是抽象方类抽象方法实现多态,取决于我们是否需要使用基类实例化的对象。

    • 抽象类:不需要使用基类实例化的对象

    • 虚方法:需要使用基类实例化的对象

    • 举例:

    1. 现有Clerk(基类),ProjectManager(继承类),此时需要使用虚方法来实现多态,因为我们需要使用Clerk创建的对象,这些对象是普通员工对象

        职员(Clerk)需要有工作计划,经理(ProjectManager)也需要有工作计划

       2. 现有Drink类作为基类,Milk,Tea类继承Drink,我们需要使用的是Milk和Tea创建对象,无需Drink创建对象,此时将Drink写成抽象类

        茶(Tea)可以饥渴,牛奶(Milk)也可以解渴————此时抽象出一个饮料(Drink)类作为基类

        

    采用虚拟方法代码如下:

     1 class Clerk
     2 {
     3     public virtual void WorkPlan()    // 此处采用virtual方法
     4     {
     5          Console.WriteLine("我是职员,我需要有工作计划");
     6     }
     7 }    
     8 class ProjectManager:Clerk  // 继承于Clerk
     9  {
    10         public override void WorkPlan()  // 用override进行重写
    11         {
    12             Console.WriteLine("我是经理,我也需要有工作计划");
    13         }
    14  }
    15         
    16 
    17 class Program              
    18 {
    19       static void Main(string[] args)
    20       {
    21           Clerk myClerk = new Clerk();
    22           ProjectManager myPM = new ProjectManager();
    23           Clerk[] clerk = { myClerk, myPM };
    24           foreach (Clerk outclerk in clerk)
    25               outclerk.WorkPlan();
    26           Console.ReadKey();     
    27       }
    28 }           

     采用抽象方法代码如下:

    abstract class Drink
    {
        public abstract void drink();   // 使用抽象化方法时,不能有方法体
    }
    
    class Milk:Drink
    {
        public override void drink()
        {
            Console.WriteLine("我是牛奶,我可以解渴");
        }
    }
    
    class Tea:Drink
    {
        public override void drink()
        {
            Console.WriteLine("我是茶,我可以解渴");
        }
    }
    

     class Program
     {
        static void Main(string[] args)
        {

        Drink myMilk = new Milk();  // 此处注意抽象类Drink是不能进行实例化的
        Drink myTea = new Tea();
        Drink[] drink = { myMilk, myTea };
        foreach (Drink outDrink in drink)
            outDrink.drink();
        Console.ReadKey();
       }
    }
  • 相关阅读:
    Qt禁止调整窗口的大小
    CentOS 6.2修改主机名
    怎么培养新人
    软件的质量控制
    如何留住骨干
    物化视图索引引发的问题
    Oracle查询脚本优化
    Oracle视图编译错误解决办法
    spring切面配置,代理用jdk和cglib的区别
    Tomcat起了一个测试桩,调用该测试桩无响应
  • 原文地址:https://www.cnblogs.com/lihq-sharefield/p/6822226.html
Copyright © 2011-2022 走看看