终于等到你~重写

简介: 前言: 在上一篇中,笔者为了给大家讲明白多态,不择手段的将Michael Joseph Jackson也拉了出来,绝对没有对老先生不尊敬的意思,只是觉得只有这样神仙级的人物才能驾驭继承和多态。今天还要借老先生接着上次的多态说一下重写~让您受累了,您再忍忍。

前言:

  在上一篇中,笔者为了给大家讲明白多态,不择手段的将Michael Joseph Jackson也拉了出来,绝对没有对老先生不尊敬的意思,只是觉得只有这样神仙级的人物才能驾驭继承和多态。今天还要借老先生接着上次的多态说一下重写~让您受累了,您再忍忍。


《重写前奏~继承和多态》中说过,在多态的父类中,将歌迷和Michael Joseph Jackson不同的地方虚拟起来,通常我们虚拟的是方法,当然属性、事件和索引器也是可以虚拟的。同时也说明了一个问题,别人的东西,我们不能照搬照抄过来,要有自己的想法,对父类进行修改。重写,便是不完全继承父类,将父类中的方法单拿出来进行修改。


重写的方法


a.重写父类的方法要用到override关键字(具有override关键字修饰的方法是对父类中同名方法的新实现)

b.要重写父类的方法,前提是父类中该要被重写的方法必须声明为virtual或者是abstract类型。给父类中要被重写的方法添加virtual关键字表示可以在子类中重写它的实现。(注意:C#中的方法默认并不是virtual类型的,因此要添加virtual关键字才能够被重写)

c.virtual关键字用于将方法定义为支持多态,有virtual关键字修饰的方法称为“虚拟方法”

     [访问修饰符] virtual [返回类型] 方法名(参数列表)

         {

   //虚拟方法的实现,该方法可以被子类重写

 }



代码展示(此代码是站在巨人的肩膀上得来):

  父类:

class Employee
    {
         public virtual void EmpInfo()
         {
                 Console.WriteLine("用virtual关键字修饰的方法是虚拟方法");
         }
    }


子类:

class DervEmployee:Employee 
    {
      public override void EmpInfo()
      {
           //base.EmpInfo();    注释1
          //base关键字用于从子类中访问父类成员。
          //即使父类的方法在子类中重写,仍可以使用base关键字调用。
          //而且,在创建子类实例时,可以使用base关键字调用父类的构造函数。
          Console.WriteLine("该方法重写base方法");
      }
    }


主函数:

static void Main(string[] args)
        {
            DervEmployee objDervEmployee = new DervEmployee();  //实例化子类
            objDervEmployee.EmpInfo();   //调用子类中重写的方法
               //注意:objDervEmployee派生类的实例是赋给Employee类的objEmployee的引用,
                // 所以objEmployee引用调用EmpInfo()方法时还是调用DervEmployee类的方法
            //Employee objEmployee = objDervEmployee;  注释二
             //objEmployee.EmpInfo();                  注释三
              Console.Read();
        }


代码讲解:

1、将注释一,注释二,注释三都注释的情况下,是重写过程,运行如图:

20160215172242257.jpg


即,通过在子类中重写,同样的方法显示的和父类的不同;

2、只注释注释二和注释三,可见base的神奇,运行如下:


20160215172543838.jpg

base可以在子类中控制重写,让父类方法在重写的情况下重见天日,Michael Joseph Jackson复活,和歌迷同台啦!!!

3、注释一,注释二,注释三都不被注释,子类父类一起被加载:

20160215172808888.jpg


是不是很神奇!


方法重写的特性

1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)  ;

2.子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常);  

3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别) 。  


小结

基础知识的介绍就到这里了,设计模式详解马上开始~






目录
打赏
0
0
0
0
4
分享
相关文章
|
5月前
重载和重写的区别
重载发生在同一个类中,方法名相同、参数列表、返回类型、权限修饰符可以不同 重写发生在子类中,方法名相、参数列表、返回类型都相同,权限修饰符要大于父类方法,声明异常范围要小于父类方法,但是final和private修饰的方法不可重写
37 1
|
10月前
|
重载与重写的区别
重载与重写的区别
94 5
|
10月前
|
重载和重写区别
重载和重写区别
55 2
重载和重写有什么区别?
重载和重写有什么区别?
83 0
类的继承和重写方法
类的继承和重写方法
87 0
什么是重载、重写,重载和重写的区别是什么?
什么是重载、重写,重载和重写的区别是什么?
121 2
什么是重载、重写,重载和重写的区别是什么?