目录
一、什么是多态?
多态:是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果。计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。
比如:上课铃响了,上体育课的学生跑到操场上站好,上语文课的学生在教室里坐好一样。
二、多态的作用
简单讲就是解耦,在详细点讲就是,多态是设计模式的基础,不能说所有的设计模式都使用到了多态,但是23种中的很大一部分,都是基于多态的。
三、多态的实现方式
-
编译时多态(静态多态): 也称为方法重载或函数重载,是在编译时根据参数的类型或个数来选择调用哪个方法。它允许在同一个类中定义多个同名方法,但参数不同。
-
运行时多态(动态多态): 也称为方法重写或函数重写,是在运行时根据对象的实际类型来选择调用哪个方法。它需要继承和方法重写的支持,通常通过父类指针指向子类对象来实现。
四、多态的应用
-
代码复用: 多态性使得我们可以通过定义通用的接口和方法来实现代码的复用,减少了冗余的代码。
-
灵活性和可扩展性: 多态性允许我们在不修改现有代码的情况下添加新的数据类型和行为,从而提高了系统的灵活性和可扩展性。
-
解耦合: 多态性可以将接口和实现分离,降低了各个模块之间的耦合程度,使得系统更易于维护和扩展。
五、多态应用分析
同一操作作用于不同的对象,可以有不同的解释产生不同的执行结果
不同数据类型的实体提供统一的接口
六、多态的优势利弊
1、优点
「代码复用 」:多态性使得可以在不修改现有代码的情况下扩展和重用代码。通过继承和方法重写,可以在子类中重用父类的方法,并根据需要进行修改或扩展。
「 可扩展性 」:多态性使得可以轻松地添加新的子类,并将其用作现有代码的替代品。这样,可以在不影响原有代码的情况下,扩展应用程序的功能。
「 简化代码 」:多态性可以使代码更加简洁和可读。通过将对象视为其超类型,可以使用相同的代码处理不同类型的对象,从而简化了代码的编写和维护。
2、缺点
「 性能损失 」:由于多态性需要在运行时确定对象的类型,因此会引入一些额外的开销,导致性能下降。尤其是在处理大量对象时,这种性能损失可能会显著影响应用程序的性能。
「 难以理解 」:多态性的概念相对复杂,需要理解继承、方法重写和动态绑定等概念。对于初学者来说,可能需要一些时间来理解和掌握多态性的概念和使用方法。
「 难以调试 」:由于多态性的特性,当出现问题时,可能需要跟踪和调试多个不同类型的对象。这可能会增加调试的难度,因为需要确保每个对象都正确地响应相应的消息。
七、代码示例
1、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;
}
}
2、OperationAdd-加法类
class OperationAdd:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
3、OperationSub-减法类
public class OperationSub:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
4、OperationMul-乘法类
class OperationMul:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
5、OperationDiv-除法类
class OperationDiv:Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB==0)
{
throw new Exception("除数不能为0.");
}
result = NumberA + NumberB;
return result;
}
}
6、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;
}
}
7、Client-客户端代码
Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
Console.WriteLine(result);
八、总结
通过这个小例子中的加减乘除类也就是子类和运算类也就是父类,对于同一个方法每个子类都有不同的实现,可以体现出多态的可扩展性,如果我们后面添加一个取余的运算,我们只需要添加一个对应的子类就可以了。 另一方面我们可以通过简单运算工厂类中的switch case来决定,在客服端中传对应的值来实例化对应的子类,这也就是我们上面所说的相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法。
多态性是面向对象编程中的一个重要概念,它提供了代码的灵活性和可扩展性。它允许不同类型的对象对同一个消息做出不同的响应,从而实现代码的复用和简化。然而,多态性也有一些缺点,如性能损失、理解和调试的困难。因此,在使用多态性时,需要权衡其优缺点,并根据具体情况进行选择和使用。