C#中重写、重载、隐藏的关系

来源:互联网 发布:biz是哪个国家的域名 编辑:程序博客网 时间:2024/06/13 03:44

       今天看完C#视频进行总结的时候,发现了三个相同又不同的名词:重写、重载和隐藏。对于他们三个理解又模糊又有点明白,现在整理一下思路。

一、方法重载和方法重写


方法名参数列表返回值类型重载必须相同必须不相同可以不相同重写相同相同
相同

          方法重载:类中有相同定义的方法的名称,但是这些方法必须有不同的调用参数(参数个数不同、参数类型不同),这样可以根据传递参数的不同来调用同一个类中的不同方法。在构造函数中使用的较多。

       例子:

               public Vector(double x,double y,double z)
        {
            this.z = x;
            this.y = y;
            this.z = z;
        }
        public Vector(Vector rhs)
        {
            x = rhs.x;
            y = rhs.y;
            z = rhs.z;
        }

        方法重写:方法重写用在虚方法和抽象方法中,方法重写的目的是现实多态,当在基类中有一个方法,而想在派生类中覆盖它时,应该把基类中的方子法声明为virtual的,他的含义是让派生类具有同样名字和参数表示的方法被调用,而不是调用基类中的子方法。而在派生类中声明次方法的时候必须用override关键字声明。它的三个要求必须都相同。

         例子:有一个People父类,他有一个GuoJI()方法,默认情况下他显示是一个中国人,而有一个American子类继承People父类,在继承GuoJi()这个方法就有点不合逻辑了,所以他就需要重写这个方法:
        class People
    {
        public virtual void GuoJi()
        {
            Console.WriteLine("大家好,我来自中国!");
        }
    }
    class American:People
    {
        public override void GuoJi()
        {
            Console.WriteLine("大家好,我来自美国!");
        }
    }

二、方法重写和隐藏

       上面方法重写中,当不把基类中的方法声明为Virtual时,可以用另一种方法来实现上面例子中的功能,那就是在派生类中声明方法时使用new关键字,从而有效的隐藏基类中的同一名字的方法。
    这种方式不叫重写,子类跟父类中的同名方法因为new这一关键字使他们没有任何关系,所以子类可以调用自己类中的这一方法而不会被基类中的同名方法所干扰。
 (需要注意的是,new关键字不可以用在抽象类中,因为抽象类中的抽象方法必须重写)
 还是上面的那个例子,我们来看一下用new的实现方法:
          class People
    {
        public void GuoJi()
        {
            Console.WriteLine("大家好,我来自中国!");
        }
    }
    class American:People
    {
        public new void GuoJi()      用new关键字来隐藏基类中同名的方法
        {
            Console.WriteLine("大家好,我来自美国!");
 

     People p1=new People();
     p1.GuoJi();
 
     American p2=new American()
    p2.GuoJi()                  
    Console.ReadLine();
  
  运行后的显示结果是:
     大家好,我来自中国!
     大家好,我来自美国!
三、总结:

       方法重载就是相同的方法名可以进行不同的操作,方法重写和隐藏可以根据自己的需求获取不同于基类中相同方法名到的方法。

       知识总是在对比和联系中加深理解,现在理解的还不到位,后面继续!




1 0