对多态的理解

简介: 对多态的理解

如果让你来写一段代码,体现多态,你会怎么写呢?

你是如何给多态下定义的,大概有几种不同的解释:

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("+");

我来说下自己的理解:

为什么父类引用指向子类对象体现了多态?

声明的是父类对象,但是编译的的时候却是子类对象,子类在被实例化的时候会将父类也一同编译!

调用方法的时候,该父类声明强转为子类对象后,是可以调用到子类的方法,所以具体实现是子类的方法,也就实现了同一个行为(方法)具有多个不同表现形式或形态的能力。其实多态的使用,不仅仅是想扩展父类的功能,而是通过重写父类方法,覆盖或者增加子类特有的功能,达到通过调用父类的方法从而最终指向具体的子类的实现方法。


不知道有没有和我有一样的疑问,上面的代码看起来更多的体现的是里氏替换原则,那多态和里氏替换有什么不同吗?


上面提到了多态更多的是过重写父类方法,覆盖或者增加子类特有的功能。而里氏替换的使用,更多的是扩展父类的功能,但是不倾向于改变父类的原始的功能,只是增加一些新的方法 。

相关文章
|
4月前
|
存储 编译器 C++
|
2月前
|
编译器 C++
C++之多态
C++之多态
|
5月前
|
存储 编译器 C++
C++【多态】
C++【多态】
44 0
|
10月前
什么是多态?
什么是多态?
39 0
|
5月前
|
编译器 C++
【C++】:多态
【C++】:多态
41 0
|
7月前
|
存储 设计模式 编译器
多态【C++】
多态【C++】
50 0
|
7月前
|
C++
|
11月前
|
C++
【C++】非常重要的——多态(一)
【C++】非常重要的——多态
44 0
|
11月前
|
编译器 C++
【C++】非常重要的——多态(三)
【C++】非常重要的——多态
73 0