【前言】
在学习设计模式的过程中,我们会时不时的接触这两个名词:重载和重写。为什么要在这篇文章中提及到重构这个概念!首先重写和重载体现了代码中类的多态性的关系,而重构是在原始代码的基础上通过一定的方法比如添加设计模式,封装类等手段使软件的性能得到了提升,从而提高软件的维护性和拓展性。添加设计模式,高内聚低耦合,增强软件拓展性,其实也是重构的一种手段。这就是为什么我们在这里提及重构的概念,希望以后大家可以在以后的学习更加清楚他们的用意!
【内容】
一:基础篇
重构(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 "汪";
}
}
三:重构,重写和重载的区别:
三重 | 条件 | 范围 | 方法体 | 参数 |
重构 | 一切对于代码设计修改的过程 | 一切对代码设计的过程,多种情况 | —— | —— |
重写 | 对于子类对父类方法的覆盖上 | 子类与父类方法上,一种情况 | 相同 | 相同 |
重载 | 同一类中的两个及两个以上方法名相同的方法上 | 方法名相同的同一个类中,一种情况 | 不同 | 不同 |
【总结】