如果让你来写一段代码,体现多态,你会怎么写呢?
你是如何给多态下定义的,大概有几种不同的解释:
1、同一个行为具有多个不同表现形式或形态的能力。多态基于继承。
2、指为不同的数据类型的实体提供统一的接口。
3、用父类的引用指向子类的对象。
如果不加思考的让我选择我会先择第一种答案,但经过深思熟虑之后我选择了第三种解释。先来看一段代码
public static void Main(string[] args) { Operation oper; oper = OperationFactory.createOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double result=oper.GetResult(); Console.WriteLine("结果是:"+result); Console.ReadKey(); }
class OperationAdd:Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } }
class OperationMul : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } }
下面两段代码可以看出加法和乘法都继承于Operation,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; } } }
从上面代码来看,最能体现多态的是下面这一句
oper = OperationFactory.createOperate("+");
我来说下自己的理解:
为什么父类引用指向子类对象体现了多态?
声明的是父类对象,但是编译的的时候却是子类对象,子类在被实例化的时候会将父类也一同编译!
调用方法的时候,该父类声明强转为子类对象后,是可以调用到子类的方法,所以具体实现是子类的方法,也就实现了同一个行为(方法)具有多个不同表现形式或形态的能力。其实多态的使用,不仅仅是想扩展父类的功能,而是通过重写父类方法,覆盖或者增加子类特有的功能,达到通过调用父类的方法从而最终指向具体的子类的实现方法。
不知道有没有和我有一样的疑问,上面的代码看起来更多的体现的是里氏替换原则,那多态和里氏替换有什么不同吗?
上面提到了多态更多的是过重写父类方法,覆盖或者增加子类特有的功能。而里氏替换的使用,更多的是扩展父类的功能,但是不倾向于改变父类的原始的功能,只是增加一些新的方法 。