通过一个程序来理解PHP里面的抽象类【2】

 

 

 

 

代码
 
   
1 <? php
2
3   header ( " Content-Type: text/html; charset=utf-8 " );
4
5   $c = new Cat( " catName " , " blue " );
6
7   $d = new Dog( " dogName " , " yellow " );
8
9   $b = new Bird( " birdName " , " flying " );
10
11
12   $l1 = new Lady( " liluo " , $c );
13
14   $l2 = new Lady( " lifeng " , $d );
15
16   $l3 = new Lady( " coco " , $b );
17
18
19   $l1 -> myPetEnjoy();
20
21   $l2 -> myPetEnjoy();
22
23   $l3 -> myPetEnjoy();
24
25   // $a = new Animal("mimi"); //Animal是一个抽象的,不能实例化
26  
27
28   abstract class Animal // 因为这个类有抽象方法,所以这个类一定要声明为抽象类
29  
30 {
31
32 private $name ;
33
34 public function __construct( $name )
35
36 {
37
38 $this -> name = $name ;
39
40 }
41
42 public abstract function enjoy(); // 把这个方法定义为抽象的,用来被重写的
43  
44 }
45
46
47   class Cat extends Animal // 类里面的方法不想自己去实现
48
49 {
50
51 // 也可以把Cat定义为abstract 类,把它的方法定义为抽象的
52
53 private $eyesColor ; // 让继承它的类去实现
54
55 public function __construct( $name , $eyesColor )
56
57 {
58
59 $this -> eyesColor = $eyesColor ;
60
61 }
62
63
64
65 public function enjoy()
66
67 {
68
69 echo ( " 猫的叫声,咪咪...... <br /> " );
70
71 }
72
73 }
74
75
76 class Dog extends Animal
77
78 {
79
80 private $furColor ;
81
82
83
84 public function __construct( $name , $furColor )
85
86 {
87
88 $this -> furColor = $furColor ;
89
90 }
91
92
93
94 public function enjoy()
95
96 {
97
98 echo ( " 狗的叫声, 汪汪...... <br /> " );
99
100 }
101
102 }
103
104
105 class Bird extends Animal
106
107 {
108
109 private $fly ;
110
111 public function __construct( $name , $fly )
112
113 {
114
115 $this -> fly = $fly ;
116
117 }
118
119
120
121 public function enjoy()
122
123 {
124
125 echo ( " 鸟飞得高, 唧唧喳喳...... <br /> " );
126
127 }
128
129 }
130
131
132 class Lady
133
134 {
135
136 private $name ;
137
138 private $Animal , $pet ;
139
140
141
142 public function __construct( $name , $pet )
143
144 {
145
146 $this -> name = $name ;
147
148 $this -> pet = $pet ;
149
150 }
151
152
153
154 public function myPetEnjoy()
155
156 {
157
158 $this -> pet -> enjoy();
159
160 }
161
162 }
163
164
165 /*
166
167 php 类的特性说明
168
169
170 类中的变量须用 $this-> 访问 而变量是静态的则用 self::访问 类中的常量也一样用 self::访问,
171
172 或子类中某变量与父类中的变量同名则子类变量over父类变量,访问的是子类变量,或父中的变量是受
173
174 保护或静态的又与子类中的变量同名,则不会over而是一新的变量,或要用self::或类名:: 方式访问
175
176 变量则需在定义变量前加 static ,
177
178
179 class father
180
181 {
182
183 private $var1;
184
185 protected $var2;
186
187 public $var3;
188
189
190 function f1(){echo("kiss<br>");}
191
192 static function f2(){echo("woods<br>");}
193
194 }
195
196
197 class son extends father
198
199 {
200
201 private static $var1 = "var1";
202
203 protected $var2;
204
205 public $var3;
206
207 public static $pv = "var1";
208
209
210 function s(){echo("love<br>");}
211
212 static function s1(){echo("love<br>");}
213
214 }
215
216
217 father::f2();
218
219 son::s();
220
221 echo(son::$pv);
222
223 */
224
225 ?>
226

 

 

抽象作用:

 

假设有一个抽象类: <形状>

 

并且有三个类继承了<形状>,它们是《三角形》《矩形》《正方形》

 

如果开关里有一个抽象方法:

 

public void PrintArea() {}; //输出面积

 

如果《形状》类是abstract 的,那么《三角形》《矩形》《正方形》

 

里面都必须定义各自的计算面积的方法,如果不定义,那么就会出错,因为它们三者计算面积的方法

 

是不同的。

 

假如《三角形》类没有定义PrintArea() 方法,则程序运行在多态时,调用〈三角形〉的方法时就会

 

出错。

 

基类PrintArea() 方法的abstract 就限制了《三角形》《矩形》《正方形》必须都有自己的方法 PrintArea() ,这是abstract 规定的。

 

抽象作用:

 

假设有一个抽象类: <形状>

 

并且有三个类继承了<形状>,它们是《三角形》《矩形》《正方形》

 

如果开关里有一个抽象方法:

 

public void PrintArea() {}; //输出面积

 

如果《形状》类是abstract 的,那么《三角形》《矩形》《正方形》

 

里面都必须定义各自的计算面积的方法,如果不定义,那么就会出错,因为它们三者计算面积的方法

 

是不同的。

 

假如《三角形》类没有定义PrintArea() 方法,则程序运行在多态时,调用〈三角形〉的方法时就会

 

出错。

 

基类PrintArea() 方法的abstract 就限制了《三角形》《矩形》《正方形》必须都有自己的方法 PrintArea() ,这是abstract 规定的。

转载于:https://www.cnblogs.com/sunss/archive/2010/09/27/1836877.html

3. 几何图形(满分50分) 版本1:满分 10 分 设计抽象类 GeometricObject 及其子类 Triangle 和Circle。 GeometricObject 类设计要求如下: ■ 一个名为 color 的Color类型的私有数据域,表示对象的颜色 ■ 一个名为 filled 的Boolean类型的私有数据域,表示对象是否 ■ 一个名为 dateCreated 的Date 类型的私有数据域,表示对象的 ■ 一个无参构造方法。 ■ 一个能创建特定 color 和filled 的有参构造方法。 ■ 相关数据域的访问器和修改器。 ■ 两个个名为 draw 和erase的抽象方法。 ■ 一个名为 getArea的抽象方法。 ■ 一个名为 getPerimeter的抽象方法。 ■ 重写 toString 方法。 Triangle 类设计要求如下: ■ 三个名为 side1、side2和 side3 的double 类型的私有数据域表 们的默认值是 1.0。要求三个数据域保留 2 位小数。 ■ 一个无参的构造方法创建默认三角形。 ■ 一个能创建带指定 side1、side2和 side3 的有参构造方法。 ■ 所有三个数据域的访问器和修改器方法。 ■ 父类抽象方法的实现。 ■ 重写 toString 方法。 Circle 类设计要求如下: ■ 一个名为 radius 的double 类型的私有数据域,表示圆的半径,数据域保留2 位小数。 ■ 一个名为 PI 的静态常量,其值为 3.14 ■ 一个无参的构造方法创建默认三角形。 ■ 一个能创建带指定 radius 的有参构造方法。 ■ radius 数据域的访问器和修改器方法。 ■ 父类抽象方法的实现。 ■ 重写 toString 方法。 测试类 TestGeometricObject1 设计要求如下: ■ 一个能随机生成 Circle 类和Triangle 类对象的静态方法 GeometricObject[] RandomCreateGeometricObject() ■ 以随机生成的数组为参数,输出数组中每个对象的基本信息、周长和面积。 ■ 类中其它方法的测试 版本2:满分 20 分 将上面的抽象类GeometricObject 改为接口,接口只保留其中四个抽象方法,声明类 Circle、Triangle 实现该接口,类的基本要求如上,同时为每个类增加一个将当前对象序列化 到指定文件的方法 writeToFile(File f)。 测试类 TestGeometricObject2 设计要求如下: ■ 一个能随机生成 Circle 类和Triangle 类对象的静态方法,该方法将随机生成的象序列 化到指定的文件 GeometricObjects.dat 中,序列化成功返回真,否则返回假。 Boolean RandomCreateGeometricObject() ■ 将GeometricObjects.dat 文件中对象全部读出,存储到 GeometricObject 对象数组中, 然后以此数组为参数,输出数组中每个对象的基本信息、周长和面积。 ■ 类中其它方法的测试。 新增一个类Rectangle ,也实现接口 GeometricObject ,同时修改测试类 TestGeometricObject2 ,体会开-闭原则。 版本3:满分 20 分 在第2 步的基础上设计实现一个具有 GUI 界面的几何图形绘制系统系统,要求实现根 据选择的几何图形类型来绘制和删除相应的图形,其中相关参数应通过界面输入,并可计算 图形的周长和面积。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值