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

【前言】   

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

【内容】

 一:基础篇

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

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

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

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

设计模式之三重定义——重载,重写,重构_第1张图片


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

二:实践篇

 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 

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

三重

条件

范围

方法体

参数

重构

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

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

——

——

重写

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

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

相同

相同

重载

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

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

不同

不同

【总结】

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



你可能感兴趣的:(◆架构之美,-------【设计模式】)