• C#中简单的继承和多态


    今天我们来聊一聊继承,说实话今天也是我第一次接触。

    继承的概念是什么呢?就是一个类可以继承另一个类的属性和方法(成员)

    继承是面向对象编程中的一个非常重要的特性。

    好了,废话不多说,下面切入正题:

    1.首先我们定义一个子类,给它创建两个构造:一个无参构造和一个有参构造

      定义一个枚举类

    在定义的子类中它有自己独有的属性:

     

    在定义的父类中的属性和构造:

     

    在Main方法中:

    同时要注意,在调用子类的带参构造时,我们要想到调用子类构造的时候,没有使用base关键字调用父类的指定的构造,默认调用父类的无参构造.

    补充一下:

       01.base代表父类对象,如果base():调用父类的构造函数

       02.base代表的是方法调用,是不需要参数类型的

      03.base(传参顺序和父类构造一致,变量名和子类构造参数一致)

    2.在这里补充一点访问修饰符

    我们所知道的:public  private  protected

    下面我画一个图来简单的描述一下(√表示可以,×表示不可以)

                      当前类     子类     其他类(Program)
       private         √          ×        ×
       protected     √          √        ×
       public           √          √        √

    总结:我们可以清晰的明白三种访问修饰符对类成员的访问限制强度:private>protected>public

     3.new 子类底层原理图

    我简单的用一个图来描述一下:

    用文字描述:

       1.走到子类构造,不进入构造体
       2.转向父类,进入父类构造体执行
       3.转回子类构造,执行子类构造体
       4.转到Main,内存中构建出子类对象

    4.继承还具有两大特性这个我们也不要忘记了,就是单根性和传递性

      单根性指的就是一个子类只有一个父类

      传递性就是只要跟父类有继承关系,就可以使用父类的属性和方法

    接下来我们讲一讲多态

    1.多态是什么呢?字面上的意思就是多种形态

    用专业一点的话来说就是指同一个操作作用于不同的对象时,可以有不同的解释,产生不同的执行效果。

    我们所接触的方法重载也是多态的一种方式。

    如何实现多态呢?不要急下面我来解说

    (1)实现方法的重写

          在父类中定义的方法,用virtual关键字来定义为虚方法

         在子类中定义自己的方法,用override关键字来修饰,实现对父类的方法的重写

    (2)定义父类变量,用子类变量初始化父类变量

    是不是觉得抽象,其实我刚开始学习时也是一样的,下面来一个小案例:

    //创建一个Person父类

     public class Person
        {
           public virtual void SayHello()
           {

                //父类特有的方法
               Console.WriteLine("父类打招呼方法");
           }
        }

    //创建一个Korea子类

    public class Korea:Person  //在这里要注意它继承于Person类
        {
           public override void SayHello()
           {
               Console.WriteLine("金喜善打招呼方法");
           }
        }

    //创建一个Chinese类

    public class Chinese:Person //在这里要注意它继承于Person类

        {
           public override void SayHello()
           {
               Console.WriteLine("你好!");
           }
        }

    //创建一个American类

    public class American:Person   //在这里要注意它继承于Person类
        {
            public override void SayHello()
            {
                Console.WriteLine("Hello");
            }
        }

     前面我们也学过泛型了下面我们就用泛型来存储

                List<Person> list=new List<Person>();
                Chinese chinese=new Chinese();
                American usa=new American();
                Korea korea=new Korea();

                list.Add(chinese);
                list.Add(usa);
                list.Add(korea);

    下面我们可以用foreach来遍历

    方式一:

               foreach (Person person in list)
                {
                   person.SayHello();
                }

    方式二:

               foreach (Person person in list)
                {

                   //方式二:不使用统一调用
                    if (person is Chinese)
                    {
                       Chinese chinese= person as Chinese;
                        chinese.SayHello();
                    }

                   if (person is Korea)
                    {
                        Korea chinese= person as  Korea;
                        korea.SayHello();
                    }

                   if (person is  American)
                    {
                        American chinese= person as  American;
                         american.SayHello();
                    }

                }

    下面我再穿插个示例:

    在Main方法中调用

     上面的两种遍历你看明白了么?不明白也不要紧,之后的bolg中我们还会讲解

    好了,我就讲到这里吧,我也是个初学者,只是把老师讲的和自己理解的用文字表述出来了,这是对我自己的一种成长!

  • 相关阅读:
    宋宝华:slab在内核内存管理和用户态Memcached的双重存在
    能感知功耗的Linux调度器(EAS)
    内存检测王者之剑—valgrind
    随心所动,厂商的CPU核管理策略介绍
    一文读懂 进程怎么绑定 CPU
    Fastbootd实现原理分析
    cachestat、cachetop、pcstat-linux系统缓存命中率分析工具
    WIFI的WPS和pin码(测试失败)
    视频下载(钉钉、B站等) 解决方案
    DevExpress 报表设计文件(.vsrepx)不显示或显示空白
  • 原文地址:https://www.cnblogs.com/wl0000-03/p/5815489.html
Copyright © 2020-2023  润新知