设计模式里的多态,答疑

本文探讨了多态在设计模式中的概念,解释了动态绑定下的多态属于覆盖形式,强调了多态是面向对象设计的核心技术。通过C++和Java的例子,阐述了如何在运行时通过接口或继承实现对象的替换,即多态性。文章还指出,设计模式大量利用多态带来的灵活性,通常在抽象基类中仅声明方法,实现在子类中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:杨贵福
链接:http://zhuanlan.zhihu.com/younggift/20484265
来源:知乎

>在java程序设计这门课中,我读的书上写到多态有两种形式,1.一个类中,具
>有相同的方法名,但参数列表不同,称这种形式为静态多态性,又叫重载。
>2.子类与父类拥有相同的属性或方法,称为动态多态性,又叫覆盖。重载和覆
>盖的区别在于,重载在编译阶段就可以知道调用哪一个方法,而覆盖在运行阶
>段才能知道调用的是子类还是父类的方法。

我没听说过动态多态、静态多态(注:查了一下,这两个术语是确实存在的,我学业不精没记住),除此以外,上面提到的内容都是对的。

overload, override.

>设计模式中提到的动态绑定下的多态我觉得属于覆盖这种。

对。

设计模式中所有的方法都基于 OO(似乎除了工厂方法),而 overload不是OO。

>文中提到 彼此有相同接口的对象 是指两个子类继承自一个父类,然后两个子
>类所实例化的对象可以相互替换?

可以。

>设计模式第十页提到:动态绑定允许你在运行时刻彼此替换有相同接口的对象。这种可替换性就称为多态。这句我不是很理解。

1. 多态,是设计模式这种OO设计手段所依赖的最核心的OO编程技术。

所以,你找到核心了。

2. 假设用C++实现。

动物类 有个方法 吃(),那么动物类的子类 鹿类 和 虎类 都可以有 吃()方法,
为方便起见假设无参或参数类型相同。

鹿类 和 虎类 可以分别实现 吃,那么就覆盖了动物类的吃。又,特别的,如果
动物类是个抽象类,吃就只是声明而没有实现。在运行时,如下。

动物类 ani*  a ;
switch (用户输入)
{
case 虎:
    a = new 虎();
    a -> 吃(); //是虎在吃,调用的是 虎::吃()
    break;
case 鹿:
    a = new 鹿();
    a -> 吃(); //是鹿在吃,调用的是 鹿::吃()
    break;
}
delete a;

以上代码中,考虑到用户输入在编译时未知,因此调用鹿::吃()还是虎::吃(),
是在运行时决定的。

这就是"动态绑定允许你在运行时刻彼此替换有相同接口的对象。这种可替换性
就称为多态。"这不是设计模式的内容,而是设计模式应用了OOP中的多态。

3. 如果用JAVA实现多态,可以不用继承,而使用接口。

某类a、类b实现了接口i,在多态的角度 可以把 类a、类b 视为子类,把 接口i
视为超类,类a、类b 的方法eatable () 实现 (或覆盖)了接口i中声明的方法
。只有在运行时才知道,接口i的实例是a类类型还是b类类型,eatable ()方法
的调用到底是a.eatable ()还是 b.eatable ()。总之运行时不会调用i.eatable
(),因为它是纯抽象的。

4. 在设计模式中,大量使用了多态,并且基类是抽象类,只有方法的声明,不
做实现。正是因为在运行时决定子类 (及其方法) ,带来了设计模式的灵活性。

> 老师:求助解答。设计模式第十页提到:动态绑定允许你在运行时刻彼此替
> 换有相同接口的对象。这种可替换性就称为多态。这句我不是很理解。在
> java程序设计这门课中,我读的书上写到多态有两种形式,1.一个类中,
> 具有相同的方法名,但参数列表不同,称这种形式为静态多态性,又叫重
> 载。2.子类与父类拥有相同的属性或方法,称为动态多态性,又叫覆盖。
> 重载和覆盖的区别在于,重载在编译阶段就可以知道调用哪一个方法,而
> 覆盖在运行阶段才能知道调用的是子类还是父类的方法。设计模式中提到
> 的动态绑定下的多态我觉得属于覆盖这种。文中提到 彼此有相同接口的对
> 象 是指两个子类继承自一个父类,然后两个子类所实例化的对象可以相互
> 替换?
>
>
> 发自ZR的小米手机

------------------------------------------------------------

博客会手工同步到以下地址:

[ zhuanlan.zhihu.com/youn]

[ 杨贵福 的专栏]

[ giftdotyoung.blogspot.com] 我本人也访问不到了,blogspot暂停更新。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值