澳门新葡萄京娱乐场PHP5.0对象模型探索之抽象方法和抽象类

  面向对象程序通过类的分段布局营造起来,在单重世襲语言如PHP中,类的接轨是树状的.
一个根类有三个或更加多的子类,再从每一个子类世襲出多个或越多下超级子类。当然,只怕存在多少个根类,用来贯彻不一样的职能。在四个了不起设计的系统中,各样根类都应该有贰个卓有功能的接口,
能够被运用代码所使用。要是大家的接纳代码被设计成与根类一齐工作,那么它也能够和其他二个从根类世襲出来的子类合营。

  抽象方法是就如子类中貌似的法子的占位符(占个地点但不起效率卡塔尔(قطر‎,它与平时方法不一致—未有其余轮代理公司码。假诺类中存在三个或更多抽象方法,
那么这几个类就成了抽象类。你无法实例化抽象类.
你必得世襲它们,然后实例化子类,你也能够把抽象类看成是子类的四个模板。

  借让你覆写全数的空洞方法,子类就改为一个兴致索然的类。若无覆写所有办法,
子类仍然是空虚的. 纵然贰个类中中带有有抽象方法(哪怕唯有四个卡塔尔(قطر‎,
你不得不评释那个类是空虚的, 在class关键字前加上abstract。

  注脚抽象方法的语法与声贝拉米(Karicare卡塔尔国般方法差异,抽象方法的还未像相仿方法那样带有在大括号{}中的主体部份,并用分号;来甘休。

  在例子6.13中,我们定义了多个满含getArea方法的类Shape。但鉴于不亮堂形状不容许明确图形的面积,确良我们注解了getArea方法为架空方法。你不可能实例化二个Shape对象,但你能够世襲它或在多个表明式中采用它,有如例6.13中那么。

  假若你创设了二个唯有空虚方法的类,你就定义了二个接口(interface卡塔尔。为了验证这种景况,PHP中有interface
和implements关键字。你能够用interface来替代抽象类,用implements来代替extends来评释您的类定义或接纳一个接口,比如,
你能够写二个myClass implements myIterface.
那二种办法能够依个人偏心来选用。

/*注:
三种办法即指:

  1. abstract class aaa{} (注意aaa中独有空虚方法,未有平时方法State of Qatar
    class bbb extends aaa{} (在bbb中覆写aaa中的抽象方法State of Qatar
  2. interface aaa{}
    澳门新葡萄京娱乐场,class bbb implements aaa{} (在bbb中覆写aaa中的抽象方法卡塔尔
    */

Listing 6.13 Abstract classes

//abstract root class 抽象根类
abstract class Shape
{
 abstract function getArea(卡塔尔(قطر‎; //定义三个虚无方法
}

//abstract child class 抽象子类
abstract class Polygon extends Shape //多边形
{
 abstract function getNumberOfSides();
}

//concrete class 实体类 三角形类
class Triangle extends Polygon
{
 public $base;
 public $height;

 public function getArea(卡塔尔国 //覆写计算面积方法
 {
  return(($this->base * $this->height)/2);
 }

 public function getNumberOfSides(卡塔尔(قطر‎ //覆写边数总计方法
 {
  return(3);
 }
}

//concrete class 实体类四边形
class Rectangle extends Polygon
{
 public $width;
 public $height;

 public function getArea()
 {
  return($this->width * $this->height);
 }

 public function getNumberOfSides()
 {
  return(4);
 }
}

//concrete class 实体类 圆形
class Circle extends Shape
{
 public $radius;

 public function getArea()
 {
  return(pi() * $this->radius * $this->radius);
 }
}

//concrete root class 定义二个颜色类
class Color
{
 public $name;
}

$myCollection = array(卡塔尔(قطر‎; //营造形状的集结,放入数组

//make a rectangle
$r = new Rectangle;
$r->width = 5;
$r->height = 7;
$myCollection[] = $r;
unset($r);

//make a triangle
$t = new Triangle;
$t->base = 4;
$t->height = 5;
$myCollection[] = $t;
unset($t);

//make a circle
$c = new Circle;
$c->radius = 3;
$myCollection[] = $c;
unset($c);

//make a color
$c = new Color;
$c->name = “blue”;
$myCollection[] = $c;
unset($c);

foreach($myCollection as $s)
{
 if($s instanceof Shape卡塔尔 //假如$s是Shape类的实例
 {
  print(“Area: ” . $s->getArea() . “n”);
 }

 if($s instanceof Polygon)
 {
  print(“Sides: ” .$s->getNumberOfSides().”n”);
 }

 if($s instanceof Color)
 {
  print(“Color: $s->name n”);
 }

 print(“n”);
}

?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注