当前位置:网站首页>对多态的理解
对多态的理解
2022-06-30 20:53:00 【赛男丨木子丿小喵】
如果让你来写一段代码,体现多态,你会怎么写呢?
你是如何给多态下定义的,大概有几种不同的解释:
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("+");我来说下自己的理解:
为什么父类引用指向子类对象体现了多态?
声明的是父类对象,但是编译的的时候却是子类对象,子类在被实例化的时候会将父类也一同编译!
调用方法的时候,该父类声明强转为子类对象后,是可以调用到子类的方法,所以具体实现是子类的方法,也就实现了同一个行为(方法)具有多个不同表现形式或形态的能力。其实多态的使用,不仅仅是想扩展父类的功能,而是通过重写父类方法,覆盖或者增加子类特有的功能,达到通过调用父类的方法从而最终指向具体的子类的实现方法。
不知道有没有和我有一样的疑问,上面的代码看起来更多的体现的是里氏替换原则,那多态和里氏替换有什么不同吗?
上面提到了多态更多的是过重写父类方法,覆盖或者增加子类特有的功能。而里氏替换的使用,更多的是扩展父类的功能,但是不倾向于改变父类的原始的功能,只是增加一些新的方法 。
边栏推荐
- Go learning notes
- 左值引用和右值引用
- 毕业设计
- Based on the open source stream batch integrated data synchronization engine Chunjun data restore DDL parsing module actual combat sharing
- Qt和其它GUI库的对比
- Scene 299
- 19.04 分配器
- 翻转链表II[翻转链表3种方式+dummyHead/头插法/尾插法]
- What are database OLAP and OLTP? Same and different? Applicable scenarios
- Lumiprobe cell biology - dia, instructions for lipophilic tracer
猜你喜欢

Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource could

Amazon restricts LGBTQ related search and product sales in the United Arab Emirates

防范未授权访问攻击的十项安全措施

基于开源流批一体数据同步引擎ChunJun数据还原—DDL解析模块的实战分享

Lumiprobe细胞生物学丨DiA,亲脂性示踪剂说明书

Huffman tree (I) basic concept and C language implementation

STL的基本组成部分
![翻转链表II[翻转链表3种方式+dummyHead/头插法/尾插法]](/img/a8/6472e2051a295f5e42a88d64199517.png)
翻转链表II[翻转链表3种方式+dummyHead/头插法/尾插法]

Lumiprobe染料酰肼丨BDP FL 酰肼方案

SQL Server 提取字符串中的纯数字
随机推荐
PHP require/include differences
动态样式绑定--style 和 class
On inline function
ICLR'22 Spotlight | 怎样度量神经网络权重中的信息量?
大学生研究生毕业找工作,该选择哪个方向?
SQL Server 提取字符串中的纯数字
C file pointer
软工UML画图
WebRTC系列-网络传输之本地scoket端口
多表操作-外键约束
FreeRTOS记录(九、一个裸机工程转FreeRTOS的实例)
Comparison between QT and other GUI Libraries
What are database OLAP and OLTP? Same and different? Applicable scenarios
Summary of personal work of 21 groups in the first week of summer training
毕业设计
Peking University ACM problems 1003:hangover
哈夫曼树(一)基本概念与C语言实现
AVL balanced binary tree (I) - concept and C language implementation
Label Contrastive Coding based Graph Neural Network for Graph Classification
Study on lumiprobe modified triphosphate biotin-11-utp