终于等到你~重写

时间:2022-04-08 03:42:32

前言:

   在上一篇中,笔者为了给大家讲明白多态,不择手段的将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、将注释一,注释二,注释三都注释的情况下,是重写过程,运行如图:

 终于等到你~重写

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

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

终于等到你~重写

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

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

终于等到你~重写


是不是很神奇!


方法重写的特性

 1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)  ; 
2.子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常);   

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

小结

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