设计模式里的多态,答疑

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

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

overload, override.

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

对。

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

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

可以。

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

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

所以,你找到核心了。

2. 假设用C++实现。

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

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

  1. 动物类 ani*  a ;
  2. switch (用户输入)
  3. {
  4. case 虎:
  5.     a = new 虎();
  6.     a -> 吃(); //是虎在吃,调用的是 虎::吃()
  7.     break;
  8. case 鹿:
  9.     a = new 鹿();
  10.     a -> 吃(); //是鹿在吃,调用的是 鹿::吃()
  11.     break;
  12. }
  13. 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. 在设计模式中,大量使用了多态,并且基类是抽象类,只有方法的声明,不
做实现。正是因为在运行时决定子类 (及其方法) ,带来了设计模式的灵活性。

f914b7e599ee58fc1c5934ca45f2154c_b

fcd12317f2f738721fd3b110128c3cbd_b

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

————————————————————

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

[zhuanlan.zhihu.com/youn]

[杨贵福 的专栏]

[giftdotyoung.blogspot.com] 我本人也访问不到了,blogspot暂停更新。

Leave a Reply