C#重写(Override)详解,(您想了解的这儿都有)

一.重写的概念:

既然想明白重写,首先肯定得了解它的概念,那么一起来看看究竟什么是重写呢?
重写:在父类中有一个方法,但是子类中也需要这个方法的名称,但是子类中的方法的逻辑与父类方法中的逻辑不相同,则需要在子类中对这个方法进行重写,重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

二.重写的原因:

如果父类中有一个方法,则子类中默认是不允许出现同名方法,如果出现了则系统认为是子类中要隐藏父类中的这个同名方法,那么在子类对象调用方法之后则调用到的是子类中的方法
如下代码所示:

1.调用子类继承父类中的方法:

 class Vecetables
    {
        public void Fot(string a,int b)
        {
            Console.WriteLine("我叫{0}是父类的第{1}个方法",a,b);
        }
    }
    class XC:Vecetables
    {
    }
      class Program
    {
        static void Main(string[] args)
        {
            Vecetables ve = new Vecetables();//父类的对象
            XC xc = new XC();//子类的对象
            ve.Fot("张三",1);//父类的方法
            xc.Fot("李四",1);//子类的方法
            Console.ReadLine();
        }
    }

运行结果:
在这里插入图片描述

2.子类与父类有同名的方法:

如果子类与父类的方法同名,那么系统默认隐藏父类中的同名方法,实际调用之后使用的是子类自己的这个方法,但是会有警告,告诉我们应该使用new关键字专门进行隐藏,如下所示:

 class Vecetables
    {
        public void Fot(string a,int b)
        {
            Console.WriteLine("我叫{0}是父类的第{1}个方法",a,b);
        }
    }
    class XC:Vecetables
    {
    public void Fot(string a, int b)
        {
            Console.WriteLine("我叫{0}是子类的第{1}个方法", a, b);
        }
    }
      class Program
    {
        static void Main(string[] args)
        {
            Vecetables ve = new Vecetables();//父类的对象
            XC xc = new XC();//子类的对象
            ve.Fot("张三",1);//父类的方法
            xc.Fot("李四",1);//子类的方法
            Console.ReadLine();
        }
    }

系统提示:
在这里插入图片描述
运行结果:
在这里插入图片描述

3.对其继承的方法进行隐藏:

new关键字写于成员类型和名称之间,如下所示,则可以正常进行显示:

public new void Fot(string a, int b)
        {
            Console.WriteLine("我叫{0}是子类的第{1}个方法", a, b);
        }

在这里插入图片描述

三.重写的目的:

子类想放弃父类中的同名方法,在子类中声明一个新的方法逻辑,从而采用子类中的自己的方法,有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,有自己的方法逻辑,只不过是想用父类的这个方法的名字,这就需要采用方法的重写;

四.重写的规则:

1. 必须是在继承里;
2. 方法名、参数个数和参数类型 都必须相同;
3. 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类;
4. 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected;

    class Vecetables
    {
        public void  Fot(string a,int b)
        {
            Console.WriteLine("我叫{0}是父类的第{1}个方法",a,b);
        }
    }
    class XC:Vecetables
    {
        protected new  void Fot(string a, int b)
        {
            Console.WriteLine("我叫{0}是子类的第{1}个方法", a, b);
        }
    }

这样子类的方法不会被引用,相当于将父类中的方法执行了两次:
在这里插入图片描述
5. 声明为 static 的方法不能被重写,但是能够被再次声明;

class Vecetables
    {
        static void  Fot(string a,int b)
        {
            Console.WriteLine("我叫{0}是父类的第{1}个方法",a,b);
        }
    }
    class XC:Vecetables
    {
        static   void  Fot(string a)
        {
            Console.WriteLine("我叫{0}是子类的方法", a);
        }
  }

程序会提示报错:
如此图所示

五.重写的前提以及好处:

既然知道了重写,那么在什么情况下进行重写又或者是重写的前提是什么呢?一起来探索下吧!
重写的前提:在进行重写时,父类中的这个方法必须是虚拟或者抽象;
重写的好处重写的好处在于子类可以根据需要,定义特定于自己独特的行为。,也就是说子类能够根据需要实现父类的方法,只是引用了父类方法的名字,但是有自己的行为,自己去实现一些方法。

猜你喜欢

转载自blog.csdn.net/qq_45096273/article/details/106779333