0
点赞
收藏
分享

微信扫一扫

C#中的继承与多态

黎轩的闲暇时光 2022-01-23 阅读 98

继承

继承是为了实现程序的复用,将父类的功能传递给子类,子类就可以省去重新定义的工作。

这一概念其实也跟面向对象紧密相关。面向对象就是将对象抽象出来,而不同的抽象层级就会得到不同的类。比如,大学生——学生——人——动物——生物,就是不断抽象的过程。越往上抽象,独有属性就越笼统,越少;越往下抽象就越具体,属性也就越丰富;而且下层的属性中必然包涵着上层的属性。大学生肯定有学生的属性,所以c#中的继承就是把上层的属性拿到下层来使用。程序可以这样使用:

  public class Person
    {
        public string Name;
        public int Age;
        public void Eat()
        {
            //吃
        }
        public void Move()
        {
            //移动
        }
    }
    public class Student : Person
    {
        public string StudentNumber;
        public string Grade;
        public void Study()
        {
            //学习
        }
    }

    //测试
    public class test
    {
        private void main()
        {
            Student stu = new Student();
            stu.StudentNumber = "202201220301";
            stu.Study();
            //除了使用student类中的属性和方法,还能直接使用父类中的属性方法,如下:
            stu.Name = "Lisa";
            stu.Move();
        }
    }

继承的一些特点:

  • 可传递性,可以传递继承,比如C从B继承,B从A继承,那C也从A继承;
  • 单一性,一个派生类只能从一个基类继承,不能从多个基类继承,但可以通过接口实现继承多个基类;
  • 访问修饰符影响,使用private定义的基类无法被继承;
  • 基类中的构造函数无法直接被继承,要使用base继承;
  • 基类对象可以引用派生类对象,也就是可以把派生类的实例赋值给基类的实例,那基类就可以使用派生类的方法和属性了。

多态 

多态是同样的方法名,根据输入参数不同进行不同的处理,这是c#中非常常见的方式,比如调用系统方法,提示有几个重载的,那方法就是多态方法。

多态的三种存在情况:

  • 重载,就是取相同的方法名,但使用不同类型的参数或者不同数量的参数,自动就构成重载,但是返回类型不同不构成重载。
            public static void Write(string moduleName, string message, Exception ex)
            {
                log4net.ILog log = log4net.LogManager.GetLogger(moduleName);
                if (ex != null)
                {
                    log.Error(message + ";" + ex.Message, ex);
                }
                if (!string.IsNullOrEmpty(message))
                {
                    log.Info(message);
                }
                log = null;
            }
    
            public static void Write(string moduleName, Exception ex)
            {
                //通过用两次moduleName,实现当前方法只需要两个参数,实现多态
                Write(moduleName, moduleName, ex);
            }
  • 重写,与继承密切相关,是在派生类中对基类的方法进行重写。一般是在基类中用关键字virtual声明一个虚方法,然后在派生类中使用override重写,就可以在不同派生类中实现不同功能。比如动物都有吃()这个方法,但是鸡的吃()是啄,狗的吃()是咬,蛇的吃()是吞,在派生类中重写吃(),就可以实现上述的表达。重写是多态的重要实现手段。

        //基类中的方法
        public  virtual void  Display()       //基类Person中定义成虚拟方法,使用virtual关键字
        {
              Console.WriteLine("{0}是{1}性,年龄为{2}", this._name, this._gender, this._age);                  
        }
    
        //派生类中的方法
        public override void Display()                 //重写基类中的Display方法
        {
              Console.WriteLine("这是一个学生:");    //在派生类中编写新代码
              base.Display();                        //调用基类的Display方法显示
        }
  • 隐藏,隐藏与重写基本相同,只是基类中的方法没使用virtual关键字定义,派生类中就只能使用new来隐藏基类的方法。

      //紧接上方的代码
      public new void Display(string no)   //使用new隐藏基类
      {
              Console.WriteLine("这是一个学生:");
              base.Display();              //调用基类的Display方法
              Console .WriteLine ("学生的学号是:{0}",no);
      }

举报

相关推荐

0 条评论