void erase() {& I. H9 `; m3 i g/ B8 V
System.out.println("Triangle.erase()");
: Z( C- P( ^; ~) |* l# A }* J' C5 f9 G! @9 |- }( C
}
% y2 ~- m- ]% D( e- E public class Shapes {# S% q' E* d; K
public static Shape randShape() {
2 D4 J8 C; h. | switch((int)(Math.random() * 3)) {
& O) m, Y: [) u$ v$ H default: // To quiet the compiler2 ?- p# b @! f( p" E4 C" A7 M
case 0: return new Circle();
9 _, m( K+ R6 v case 1: return new Square();
1 q# u* I# C! C$ K case 2: return new Triangle();+ @0 ?( F. w: [4 N6 x! K& D
}
- l9 U) q3 K) I }
7 K; z M. d4 n' \1 l5 ] public static void main(String[] args) {& a9 Z3 I/ N! |- ]" }5 [
Shape[] s = new Shape[9];# y9 F: `9 @ r! t
// Fill up the array with shapes:4 i c+ f* U0 B. q3 I5 S
for(int i = 0; i < s.length; i++)
% ?; J! g- o# {3 Z! f2 a, x2 A s = randShape();
3 b! c# H0 {5 J0 ^5 f3 W5 g // Make polymorphic method calls:
, k, Q; U2 x6 t0 m9 T- R for(int i = 0; i < s.length; i++)
6 O" _" a! P# g- f/ S s.draw();
; g. I* W, z- p! @7 G u }* M& z/ X3 I% v+ F g8 `+ c, }* Y
} ///:~/ b% x" |; d+ i2 E
针对年夜Shape衍生出来的所有工具,Shape成立了一个通用接口——也就是说,所有(几何)外形都可以描画和删除。衍生类笼盖了这些界说,为每种非凡类型的几何外形都供给了并世无双的行为。6 {! w0 H* n+ o3 p
在主类Shapes里,包含了一个static体例,名为randShape()。它的浸染是在每次挪用它时为某个随机选择的Shape对象生成一个句柄。请注重上溯造型是在每个return语句里发生的。这个语句取得指向一个Circle,Square或者Triangle的句柄,并将其作为返回类型Shape发给体例。所以无论什么时辰挪用这个体例,就绝对没机缘体味它的具体类型到底是什么,因为必定会获得一个纯挚的Shape句柄。
; I) m: W, v+ F6 f- z. w main()包含了Shape句柄的一个数组,其中的数据经由过程对randShape()的挪用填入。在这个时辰,我们知道自己拥有Shape,但不知除此之外任何具体的情形(编译器同样不知)。然而,当我们在这个数组里步进,并为每个元素挪用draw()的时辰,与各类型有关的正确行为会魔术般地发生,就象下面这个输出示例展示的那样:: v6 L" F+ w0 L2 Y
Circle.draw()
$ O. o, l. r" o0 y! t% I7 y Triangle.draw()
7 B" V5 |) i) r- Y4 C Circle.draw()% }2 D s2 Y& k! Q' g/ N5 O( r" V( ~
Circle.draw()3 U+ u0 E5 A8 |( W3 U- N9 G
Circle.draw()
% g9 A4 A6 J+ l2 f; K8 { Square.draw()
$ |3 U O+ t& t5 ] Triangle.draw()$ [, v, ^! n! t! ^! p) [" I
Square.draw()( d5 P/ D; D+ w: B+ @% o& @
Square.draw()0 L+ c1 w% q7 v* E g4 ]
当然,因为几何外形是每次随机选择的,所以每次运行都可能有分歧的结不美观。之所以要凸起外形的随机选择,是为了让巨匠深刻体味这一点:为了在编译的时辰发出正确的挪用,编译器毋需获得任何非凡的情报。对draw()的所有挪用都是经由过程动态绑定进行的。 |