• 类的多态


    在类的继承中,c#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中可以有不同的实现方法,从而解决同一问题提供多种途径。

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

    C#中可以通过多种途径实现多态性。

    1. 虚方法:经父类的方法标记为虚方法,使用该关键字vitrual,此方法在子类中可以重写(使用关键字override
    2. 抽象类与抽象方法:如果我们不需要使用父类创建对象,他的存在只是提供子类继承。可以将父类写成抽象(关键字abstract)类,将父类方法写成抽象方法,子类中的方法扔使用重写(override
    3. 接口的实现:

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

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

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

    比如说现在有一个clerk类作为基类,jl类继承clerk,这个时候我们就需要使用虚方法来实现多态了,因为我们要使用clerk创建的对象,这些对象就是普通员工对象。

    在比如说,现在一个drink类作为基类,milktea类继承drink,我们需要使用的是milktea创建的对象,根本不需要使用drink创建对象,所以在这里drink完全可以写成抽象类

    类的多态

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 类的多态之抽象类
    {
        class jl:clerk
        {
            public override void write()
            {
                Console.WriteLine("我是经理,我有工作计划");
            }
        }
    }
    
    
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 类的多态之抽象类
    {
        class clerk
        {
    
            public virtual void write() //两个方法的名字要一样,因为我们要重载和重写
            {
                Console.WriteLine("我是员工,我有工作计划");
            }
        }
    }
    
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 类的多态之抽象类
    {
        class Program
        {
            static void Main(string[] args)
            {
                clerk duw = new clerk();
                jl linz = new jl();
                clerk[] cll = { duw,linz};
                foreach (clerk all in cll)
                {
                    all.write();
                }
                Console.ReadKey();
            }
        }
    }
    

     类的多态-抽象类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 类的多态之抽象类
    {
        abstract class drink
        {
            //利用抽象来实现类的抽象化,方法抽象画,并且方法中不能有方法体。
            public abstract void write();
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 类的多态之抽象类
    {
        class milk:drink
        {
            public override void write()
            {
                Console.WriteLine( "我是牛奶,我可以解渴");
            }
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 类的多态之抽象类
    {
        class tea:drink
        {
            public override void write()
            {
                Console.WriteLine("我是茶,我可以解渴");
            }
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 类的多态之抽象类
    {
        class Program
        {
            static void Main(string[] args)
            {
                //drink mmilk = new drink();
                ////抽象类是不允许创建实例的。
                //milk mymilk = new milk();
                //tea mytea = new tea();
               //这么写也是对的因为我们是继承在drink类中的
                drink mymilk = new milk();
                drink mytea = new tea();
                drink[] mydrink={mymilk,mytea};
                foreach (drink ismydrink in mydrink)
                {
                    ismydrink.write();
                }
                Console.ReadKey();
    
            }
        }
    }
    
  • 相关阅读:
    跟我extjs5(38--单个模块的设计[6获得模块列表数据])
    Visual Prolog 的 Web 专家系统 (8)
    ssh, maven and eclipse 那些破事
    在工厂模式
    IOS获取来电去电来电归属系统通知达到效果(一)
    基于CORS的geoserver同源访问策略
    springMVC1 springmvc的基础知识
    mybatis0212 mybatis逆向工程 (MyBatis Generator)
    mybatis0211 mybatis和spring整合
    mybatis0210 mybatis和ehcache缓存框架整合
  • 原文地址:https://www.cnblogs.com/xiaowie/p/8608088.html
Copyright © 2020-2023  润新知