« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
暂无公告... |
Blog信息 |
blog名称:七月天 日志总数:19 评论数量:84 留言数量:0 访问次数:200030 建立时间:2004年11月4日 |

| |
[设计模式]设计模式(7)--原则1:对接口编程 读书笔记, 软件技术
torrent 发表于 2005/8/8 22:46:20 |
类继承与接口继承
理解对象的类与对象的类型的不同非常重要。
对象的类定义了对象如何实现,类定义了对象的内部状态及操作的实现。对象的类型所指的仅仅是它的接口—即类可以响应的请求的集合,对象可有多个类型,不同类的对象可以拥有同一类型。
当然,类和类型之间有更紧密的关系。因为类定义了对象可执行的操作,因此,类也定义了对象的类型。当我们说对象是类的一个实例,实际上暗示了此对象支持类所定义的接口。
C++和Eiffel语言用类同时来描述对象的类型和对象的实现。Smalltalk语言并不声明变量的类型,因此,编译器并不检查那种是变量类型的子类型的变量的对象类型。发送消息时需要检查接受者的类,但当接受器是特定类的实例时,则不需检查。
理解对象继承和接口继承(或子类型)的区别亦十分重要。类继承定义对象的实现是根据另一个对象的实现,简单的说,它是一种用于代码和表示共享的机制;与之比较,接口继承(子类型)规定了对象何时用来替代另一个。
很容易混淆这两个概念,因为多数语言对此不作区分。在C++和Eiffel中,继承意味着接口继承和实现继承。C++中继承一个接口的标准方式是从一个具有(纯)虚成员方法的类中公开声明继承。纯接口继承近似于C++中的从纯虚函数公开继承。在Smalltalk中,继承仅意味着继承的实现,你可以将任何类的实例分配给一个变量,只要实例支持在该变量的值上执行操作。
尽管大多数的语言都不支持接口继承和实现继承的区分,人们在实践中对此进行了区分。Smalltalk程序员通常将子类型当作子类来处理();C++程序员通过抽象类所定义的类型来操作对象。
很多设计模式都依赖于这种区分。例如,责任链对象必须有一个公共类型,但通常不共享一个公共实现。在合成模式中,元件定义了一个公共接口,但合成器通常定义一个公共实现。命令模式、观测者模式、状态模式、和策略模式常常要实现纯接口的抽象类。
对接口而非对实现进行编程
类继承主要作为通过重用父类的函数而扩展应用的功能的机制,它可从旧对象迅速生成新对象,让你从已存在的类中继承你所需要的功能,从而得到新的实现。
然而,执行重用不需要做这么多工作。继承的能力包括用相同的接口(通常从抽象类中继承)定义对象族,这也很重要。为什么呢?因为多态性依赖于它。
当合适的使用继承时,所有源于抽象类的类都共享其接口。这说明子类仅仅增加或重载操作,并不隐藏父类的操作。所有的子类都能向对抽象类的接口的请求作出响应,因此,他们都是抽象类的子类型。
从抽象类所定义的接口单独地操纵对象有两个好处:
1. 只要对象使用客户所预期的接口,客户不必关心对象所使用的详细类型。
2. 客户不必关心实现这些对象的类,客户所要了解的仅仅是定义接口的抽象类。
这样,减少了子系统间的实现依赖性,导致了以下的可重用的面向对象设计的原则:
为接口而不为实现编程
不要为特定具体类的实例声明变量,而应该向抽象类定义的接口提交。你将发现,这也是本书所讨论的设计模式的普遍主题。
当然,系统中有时必须实例化具体对象(即详细描述特定实现),创建性模式就可实现这样的功能。通过对对象创建过程的抽象,这些模式让你以不同方式将接口与其实现相联系,从而透明地实例化。创建性模式可以确保你的系统的编写是根据接口而不是实现。 |
|
回复:设计模式(7)--原则1:对接口编程 读书笔记, 软件技术
小微(游客)发表评论于2007/5/11 15:50:17 |
|
» 1 »
|