概念说明
多态:是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果。计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。
举个例子来说,当我们需要通过手机app去扫码支付的时候,我们可以有不同的支付方式,比如微信、支付宝,银行卡等等。我们向外展示的是通过手机扫码去支付,不需要关注我们具体使用的是什么支付方式。多态主要体现在相同的扫码支付行为但是支付方式是不同的。
优势利弊
优点
「代码复用 」:多态性使得可以在不修改现有代码的情况下扩展和重用代码。通过继承和方法重写,可以在子类中重用父类的方法,并根据需要进行修改或扩展。
「 可扩展性 」:多态性使得可以轻松地添加新的子类,并将其用作现有代码的替代品。这样,可以在不影响原有代码的情况下,扩展应用程序的功能。
「 简化代码 」:多态性可以使代码更加简洁和可读。通过将对象视为其超类型,可以使用相同的代码处理不同类型的对象,从而简化了代码的编写和维护。
缺点
「 性能损失 」:由于多态性需要在运行时确定对象的类型,因此会引入一些额外的开销,导致性能下降。尤其是在处理大量对象时,这种性能损失可能会显著影响应用程序的性能。
「 难以理解 」:多态性的概念相对复杂,需要理解继承、方法重写和动态绑定等概念。对于初学者来说,可能需要一些时间来理解和掌握多态性的概念和使用方法。
「 难以调试 」:由于多态性的特性,当出现问题时,可能需要跟踪和调试多个不同类型的对象。这可能会增加调试的难度,因为需要确保每个对象都正确地响应相应的消息。
代码示例
在大话设计模式中的第9、10和11页中,讲述了关于计算器的一个小例子。那我们就拿计算器这个小例子来看一下有没有体现多态,如果有在哪一部分体现的多态?
Operation-运算类
public class Operation { private double _numberA = 0; private double _numberB = 0; public double NumberA { get { return _numberA; } set { _numberA = value; } } public double NumberB { get { return _numberB; } set { _numberB = value; } } public virtual double GetResult() { double result = 0; return result; } }
OperationAdd-加法类
class OperationAdd:Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } }
OperationSub-减法类
public class OperationSub:Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } }
OperationMul-乘法类
class OperationMul:Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } }
OperationDiv-除法类
class OperationDiv:Operation { public override double GetResult() { double result = 0; if (NumberB==0) { throw new Exception("除数不能为0."); } result = NumberA + NumberB; return result; } }
OperationFactory-简单运算工厂类
class OperationFactory { public static Operation createOperate(string operate) { Operation oper=null; switch (operate) { case "+": oper = new OperationAdd(); break; case "-": oper=new OperationSub(); break; case "*": oper=new OperationMul(); break; case "/": oper=new OperationDiv(); break; } return oper; } }
Client-客户端代码
Operation oper; oper = OperationFactory.createOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult(); Console.WriteLine(result);
总结提升
通过这个小例子中的加减乘除类也就是子类和运算类也就是父类,对于同一个方法每个子类都有不同的实现,可以体现出多态的可扩展性,如果我们后面添加一个取余的运算,我们只需要添加一个对应的子类就可以了。 另一方面我们可以通过简单运算工厂类中的switch case来决定,在客服端中传对应的值来实例化对应的子类,这也就是我们上面所说的相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法。
多态性是面向对象编程中的一个重要概念,它提供了代码的灵活性和可扩展性。它允许不同类型的对象对同一个消息做出不同的响应,从而实现代码的复用和简化。然而,多态性也有一些缺点,如性能损失、理解和调试的困难。因此,在使用多态性时,需要权衡其优缺点,并根据具体情况进行选择和使用。