a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 126|回复: 0

[基础知识] JAVA基础:最大化Java代码的可重用性(2)

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
 第二步:将非原始的输入参数类型改为接口类型   在面向对象编程中,代码重用的真正基础在于通过接口参数类型利用多态性,而不是通过类继承,正如Allen Holub在 “Build User Interfaces for Object-Oriented System, Part 2”中所述:+ m9 e) L& p# o. F4 c3 m
  “……你应该通过对接口而不是类编程实现重用。如果一个方法的所有参数都是某个已知接口的引用,这个接口由一些你所不知道的类实现,那么这个方法就能够操作这样一些对象:当编写方法的代码时,这些对象的类甚至还不存在。从技术上讲,可重用的是方法,而不是传递给方法的对象。”! s+ ^, }+ X) Q" n! T9 ?4 Z
  将Holub所讲的方法应用于第一步所得到的结果,只要某块功能代码能够作为一个全局可见的过程而独立存在,你就可以将其每个类类型(class- type)的输入参数改为一个接口类型,这样便能进一步提高其重用的潜力。那么,实现此接口类型的任何类的对象都可以作为参数使用,而不仅仅局限于原始类。由此,这个过程对可能存在的大量的对象类型都成为可用的。7 m2 T; ?4 G; S* i! \9 V# w. g( T0 }
  例如,有这样一个全局可见的静态过程
: ?" W+ l) ]- z2 n& W8 Y6 i  static public boolean contains(Rectangle rect, int x, int y) {…}
7 S# f2 f! u5 Y9 F! J4 S% L" Z2 Z  这个方法用于检查给定的矩形是否包含某个给定的点。在这个例子中,rect参数的类型可以从Rectangle类改变为接口类型,如下所示:
  l+ S. t- x9 {& O* |/ g7 [/ i* \$ O  static public boolean contains(Rectangular rect, int x, int y){…}
5 i0 H# S9 ^- `+ U- {% _  Rectangular可以是下面形式的接口:
: x: g* [- y2 y  public interface Rectangular{- I  W- t, ^" p, g
  Rectangle getBounds();
  G# l2 L2 B8 f/ C  }+ ?0 n3 ]9 n0 a8 g1 C/ F
  现在,所有可以被描述为矩形的类(也就意味着实现了Rectangular接口)的对象都可以作为传递给pRectangular.contains()的rect参数。通过放宽所传递的参数类型的限制,我们使方法具有更好的可重用性。
1 w* Q/ `1 W: |: o1 r0 P0 c  不过,在上面这个例子中,Rectangular接口的getBounds方法返回一个Rectangle类型,你可能会怀疑使用这个接口是否具有真正的价值;换句话说,如果我们知道传入过程的对象会在被调用时返回一个Rectangle,为什么不直接传入Rectangle取代接口类型呢?不这样做的最重要原因与集合有关,假设有这样一个方法:
# i( b( L3 k8 `7 j! b: t  static public boolean areAnyOverlapping(Collection rects) {…}5 T' f& p- H9 y& E4 b5 f
  这个方法的目的在于检查给定集合中的任意矩形对象是否存在重叠。那么,在方法内部遍历集合中的每个对象时,如果无法将对象造型(cast)成如 Rectangular这样的接口类型,那么将如何能够访问对象的矩形区域呢?唯一的选择是将对象造型成为其特定的类型(我们直到它有一个能够返回 rectangle的方法),这意味着方法必须事先知道其所要操作的是什么类型。这恰恰是这一步骤力图首先要避免的问题!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-6 09:11 , Processed in 0.689187 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表