设计模式之三重定义——重载,重写,重构

【前言】   

    在学习设计模式的过程中,我们会时不时的接触这两个名词:重载和重写。为什么要在这篇文章中提及到重构这个概念!首先重写和重载体现了代码中类的多态性的关系,而重构是在原始代码的基础上通过一定的方法比如添加设计模式,封装类等手段使软件的性能得到了提升,从而提高软件的维护性和拓展性。添加设计模式,高内聚低耦合,增强软件拓展性,其实也是重构的一种手段。这就是为什么我们在这里提及重构的概念,希望以后大家可以在以后的学习更加清楚他们的用意!

【内容】

 一:基础篇

重构(Refactoring):就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性

重写(Overriding):子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

重载:(Overloading):简单说就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法.

他们三者的关系我暂时的理解如下(这是我给他们之间定义的关系,如有不同见解请联系我!)



重构到此的结束,我们的重点在于理解重载和重写的关系!

二:实践篇

 1:重载

重载(Overloading) 的特点:
    重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

    举个简单的例子:我们可以给一个猫起名字叫“美丽”;也可以给她起名字,直接叫猫猫。但是同样都是属于同一类猫方法,但是却是可以多次调用,返回不同的值。

 class Cat
    {
        private string name = "";
//注意这里构造函数是有参数的“name”的。
        public Cat(string name)   
        {
            this.name = name;
        }
 //注意这里的构造函数是无参数的,在这个函数体里面直接给出了实际的名字。
        public Cat()            
        {
            this.name = "猫猫";  
        }
        public string shout()
        {
            return name;
        }
    }
//客户端代码
 class Program
  {
        static void Main(string[] args)
        {
            Cat cat = new Cat();  
            Console.WriteLine( cat.shout());
          
            Cat cat1 = new Cat("美丽");
            Console.WriteLine(cat1.shout());
            Console.Read();
           
        }
    }
   在这里注意一下: 是提供了创建多个方法的能力,但是这些方法使用不同的参数类型。我们在cat()这个构造函数里面还可以写出更多的参数name,sex,age等等,可以被重复的加载。

  当然要在这里普及一下构造函数的好处了,以一下的代码为例:

  class Program
    {
        static void Main(string[] args)
        {
            //没有使用构造函数代码
            Cat cat = new Cat();
            cat.name = "美丽";
            cat.sex = '女';
            cat.age = 1;
           //使用了构造函数的代码
            Cat cat=new Cat("美丽","女","1");
            cat.shout();
        }

    }

    通过代码我们就可以看到,通过使用构造函数可以再类中就对构造函数进行初始化,大大简化了客户端代码的数量,增加了维护性;而且客户端只能通过构造函数访问类,保证了类的封装性和安全性。这也是重构的一种小小的体现啦!

 2:重写

重写(Overriding)的特点:

  若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
  子类函数的访问修饰权限不能少于父类的;

   同样也举一个简单的例子:对于动物来说,每一种动物都有叫声,但是每一种动物的叫声又是不一样。看似不一样,但是我们可以再抽象动物类中虚拟出”叫“的方法,然后在不同的动物个体中存放不同声音!

  //抽象类animal-----------------------------
   class Animal
     {
        protected string name = "";
        public Animal(string name)
        {
            this.name = name;
        }
        protected int shouNum = 3;
        public int ShoutNum
        {
            get { return shouNum;}
            set { shouNum = value; }
        
        }
      public string shout()
        {
               string result="";
                for (int i = 0; i <shouNum; i++)
                result += "";
                return "我的名字叫" + name + "" + result;  
        }
    //虚拟方法:主要重写的方法
        protected virtual string getshoutsound()   
        {
            return "";
        }
    }
    //类cat
        class Cat : Animal
        {
            public Cat(string name)
                : base(name)
            { }
         //类cat对方法getshoutsound()进行了重写覆盖
            public override string getshoutsound()    
            {
                return "喵";
            }
        }
    //类dog
        class Dog:Animal
        {
            public Dog(string name)
                : base(name)
            { }
         //类dog对方法getshoutsound()进行了重写覆盖
            public override string getshoutsound()  
            {
               return "汪";  
            }
        }

三:重构,重写和重载的区别:

三重

条件

范围

方法体

参数

重构

一切对于代码设计修改的过程

一切对代码设计的过程,多种情况

——

——

重写

对于子类对父类方法的覆盖上

子类与父类方法上,一种情况

相同

相同

重载

同一类中的两个及两个以上方法名相同的方法上

方法名相同的同一个类中,一种情况

不同

不同

【总结】

     对于在对三重定义的了解之后,发现其实他们还是具有很大的区别: 重写是子类的方法覆盖父类的方法,要求方法名和参数都相同 ; 重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同。重构从本质来说是提高软件的性能,但是重构是可以通过重写或者重载等, 但不限于此。



评论 86
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值