在学习《大话设计模式》的时候经常会遇到多态,但什么是多态?为什么要使用多态?什么时候用多态?多态是如何实现的?使用多态有什么好处?我们将根据以上五个问题展开激烈的讨论。
什么是多态?
多态,顾名思义指“多种形态”。多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
例:猪、狗、猫都属于动物类,我们将动物类作为父类,猪“哼哼叫”,狗“汪汪叫”,猫“喵喵叫”,猪、狗、猫三者都能叫,但三者都要通过重写父类的方法才能实现。
为什么要使用多态?使用多态有什么好处?
我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。
代码重用,也称代码复用, 就是说你把一个功能写成一个模块, 以便再次需要相同功能的时候,可以直接使用,而不用重新开发。
举例: 假如你的网站需要验证码, 你就可以把验证码这个功能单独提取出来以便复用。
通常代码复用是通过类与对象来实现的, 这也是面向对象编程与面向过程编程最主要的区别之一。
作为面向对象的三大特性之一,多态也有代码重用的功能,还有解决项目中紧耦合的问题,提高程序的可扩展性·。
举例:添加一个子类,继承父类,重写父类的方法。至此,该程序的扩展性得到了提升,而又不需要查看源代码是如何实现的就可以扩展新功能。
什么时候用多态?
- 方法中的参数
class Program
{
static void Main(string[] args)
{
Person p=new Person();
Audi audi=new Audi();
p.setDriver(audi);
p.drive();
SBenz benz=new SBenz();
p.setDriver(benz);
p.drive();
}
}
public abstract class Driver
{
public abstract void run();
}
class SBenz : Driver
{
public override void run()
{
Console.WriteLine("大奔");
}
}
class Audi:Driver
{
public override void run()
{
Console.WriteLine("奥迪");
}
}
class Person
{
private Driver driver;
public Person() { }
public Person(Driver driver)
{
this.driver = driver;
}
public void drive()
{
driver.run();
}
public void setDriver(Driver driver)
{
this.driver = driver;
}
}
- 方法的返回类型
public class CarFactory
{
public static Driver createCar(string carName)
{
if (carName.Equals("Audi"))
{
return new Audi();
}
else if (carName.Equals("Benz"))
{
return new SBenz();
}
else
{
Console.WriteLine("出门左拐");
return null;
}
}
}
多态是如何实现的?
- 父类是抽象类,方法是抽象方法(没有方法体,也不能实例化),子类重写父类的方法
- 父类中是虚方法(有方法体,能实例化),子类重写父类的方法
小结
- 虚方法一定要有方法体(哪怕只是大括号),抽象方法一定没有方法体
- 虚方法可以被子类重写,抽象方法必须被子类重写
- 如果我们不需要使用父类创建对象,它的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类的方法写成抽象方法,子类中的方法仍用关键字override重写
- 抽象类不能被实例化
- 多态是指类可以有多种形态,通过修改可以形成多个的实现方法。当子类从父类继承时,它会获得父类的所有方法、字段、属性和事件。若要更改父类的数据和行为,通常有两种选择,第一种是在子类的访问修饰符后加new,就是隐藏了基类(父类)的方法,第二种是在子类中重写父类的方法,更换方法里的内容。
耐心点,坚强点,总有一天,你承受过的疼痛会有助于你,生活从来不会刻意亏欠谁,它给了你一块阴影,必会在不远的地方撒下阳光。