第十節(jié)--抽象方法和抽象類
更新時間:2006年11月16日 00:00:00 作者:
/*
+-------------------------------------------------------------------------------+
| = 本文為Haohappy讀<<Core PHP Programming>>
| = 中Classes and Objects一章的筆記
| = 翻譯為主+個人心得
| = 為避免可能發(fā)生的不必要的麻煩請勿轉(zhuǎn)載,謝謝
| = 歡迎批評指正,希望和所有PHP愛好者共同進(jìn)步!
| = PHP5研究中心: http://blog.csdn.net/haohappy2004
+-------------------------------------------------------------------------------+
*/
第十節(jié)--抽象方法和抽象類
面向?qū)ο蟪绦蛲ㄟ^類的分層結(jié)構(gòu)構(gòu)建起來. 在單重繼承語言如PHP中, 類的繼承是樹狀的. 一個根類有一個或更多的子類,再從每個子類繼承出一個或更多下一級子類. 當(dāng)然,可能存在多個根類,用來實(shí)現(xiàn)不同的功能. 在一個良好設(shè)計的體系中,每個根類都應(yīng)該有一個有用的接口, 可以被應(yīng)用代碼所使用. 如果我們的應(yīng)用代碼被設(shè)計成與根類一起工作,那么它也可以和任何一個從根類繼承出來的子類合作.
抽象方法是就像子類中一般的方法的占位符(占個地方但不起作用),它與一般方法不同—沒有任何代碼. 如果類中存在一個或更多抽象方法, 那么這個類就成了抽象類. 你不能實(shí)例化抽象類. 你必須繼承它們,然后實(shí)例化子類. 你也可以把抽象類看成是子類的一個模板.
如果你覆寫所有的抽象方法, 子類就變成一個普通的類. 如果沒有覆寫所有方法, 子類仍是抽象的. 如果一個類中中包含有抽象方法(哪怕只有一個), 你必須聲明這個類是抽象的, 在class關(guān)鍵字前加上abstract.
聲明抽象方法的語法與聲明一般方法不同. 抽象方法的沒有像一般方法那樣包含在大括號{}中的主體部份,并用分號;來結(jié)束.
在例子6.13中, 我們定義了一個含有g(shù)etArea方法的類Shape. 但由于不知道形狀不可能確定圖形的面積,確良我們聲明了getArea方法為抽象方法. 你不能實(shí)例化一個Shape對象,但你可以繼承它或在一個表達(dá)式中使用它, 就像例6.13中那樣.
如果你建立了一個只有抽象方法的類,你就定義了一個接口(interface). 為了說明這種情況, PHP中有interface 和implements關(guān)鍵字. 你可以用interface來代替抽象類, 用implements來代替extends來說明你的類定義或使用一個接口. 例如, 你可以寫一個myClass implements myIterface. 這兩種方法可以依個人偏愛來選擇.
/*注:
兩種方法即指:
1. abstract class aaa{} (注意aaa中只有抽象方法,沒有一般方法)
class bbb extends aaa{} (在bbb中覆寫aaa中的抽象方法)
2. interface aaa{}
class bbb implements aaa{} (在bbb中覆寫aaa中的抽象方法)
*/
Listing 6.13 Abstract classes
+-------------------------------------------------------------------------------+
| = 本文為Haohappy讀<<Core PHP Programming>>
| = 中Classes and Objects一章的筆記
| = 翻譯為主+個人心得
| = 為避免可能發(fā)生的不必要的麻煩請勿轉(zhuǎn)載,謝謝
| = 歡迎批評指正,希望和所有PHP愛好者共同進(jìn)步!
| = PHP5研究中心: http://blog.csdn.net/haohappy2004
+-------------------------------------------------------------------------------+
*/
第十節(jié)--抽象方法和抽象類
面向?qū)ο蟪绦蛲ㄟ^類的分層結(jié)構(gòu)構(gòu)建起來. 在單重繼承語言如PHP中, 類的繼承是樹狀的. 一個根類有一個或更多的子類,再從每個子類繼承出一個或更多下一級子類. 當(dāng)然,可能存在多個根類,用來實(shí)現(xiàn)不同的功能. 在一個良好設(shè)計的體系中,每個根類都應(yīng)該有一個有用的接口, 可以被應(yīng)用代碼所使用. 如果我們的應(yīng)用代碼被設(shè)計成與根類一起工作,那么它也可以和任何一個從根類繼承出來的子類合作.
抽象方法是就像子類中一般的方法的占位符(占個地方但不起作用),它與一般方法不同—沒有任何代碼. 如果類中存在一個或更多抽象方法, 那么這個類就成了抽象類. 你不能實(shí)例化抽象類. 你必須繼承它們,然后實(shí)例化子類. 你也可以把抽象類看成是子類的一個模板.
如果你覆寫所有的抽象方法, 子類就變成一個普通的類. 如果沒有覆寫所有方法, 子類仍是抽象的. 如果一個類中中包含有抽象方法(哪怕只有一個), 你必須聲明這個類是抽象的, 在class關(guān)鍵字前加上abstract.
聲明抽象方法的語法與聲明一般方法不同. 抽象方法的沒有像一般方法那樣包含在大括號{}中的主體部份,并用分號;來結(jié)束.
在例子6.13中, 我們定義了一個含有g(shù)etArea方法的類Shape. 但由于不知道形狀不可能確定圖形的面積,確良我們聲明了getArea方法為抽象方法. 你不能實(shí)例化一個Shape對象,但你可以繼承它或在一個表達(dá)式中使用它, 就像例6.13中那樣.
如果你建立了一個只有抽象方法的類,你就定義了一個接口(interface). 為了說明這種情況, PHP中有interface 和implements關(guān)鍵字. 你可以用interface來代替抽象類, 用implements來代替extends來說明你的類定義或使用一個接口. 例如, 你可以寫一個myClass implements myIterface. 這兩種方法可以依個人偏愛來選擇.
/*注:
兩種方法即指:
1. abstract class aaa{} (注意aaa中只有抽象方法,沒有一般方法)
class bbb extends aaa{} (在bbb中覆寫aaa中的抽象方法)
2. interface aaa{}
class bbb implements aaa{} (在bbb中覆寫aaa中的抽象方法)
*/
Listing 6.13 Abstract classes
復(fù)制代碼 代碼如下:
<?php
//abstract root class 抽象根類
abstract class Shape
{
abstract function getArea(); //定義一個抽象方法
}
//abstract child class 抽象子類
abstract class Polygon extends Shape //多邊形
{
abstract function getNumberOfSides();
}
//concrete class 實(shí)體類 三角形類
class Triangle extends Polygon
{
public $base;
public $height;
public function getArea() //覆寫計算面積方法
{
return(($this->base * $this->height)/2);
}
public function getNumberOfSides() //覆寫邊數(shù)統(tǒng)計方法
{
return(3);
}
}
//concrete class 實(shí)體類四邊形
class Rectangle extends Polygon
{
public $width;
public $height;
public function getArea()
{
return($this->width * $this->height);
}
public function getNumberOfSides()
{
return(4);
}
}
//concrete class 實(shí)體類 圓形
class Circle extends Shape
{
public $radius;
public function getArea()
{
return(pi() * $this->radius * $this->radius);
}
}
//concrete root class 定義一個顏色類
class Color
{
public $name;
}
$myCollection = array(); //建立形狀的集合,放入數(shù)組
//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類的實(shí)例
{
print("Area: " . $s->getArea() .
"<br>\n");
}
if($s instanceof Polygon)
{
print("Sides: " .
$s->getNumberOfSides() .
"<br>\n");
}
if($s instanceof Color)
{
print("Color: $s->name<br>\n");
}
print("<br>\n");
}
?>
//abstract root class 抽象根類
abstract class Shape
{
abstract function getArea(); //定義一個抽象方法
}
//abstract child class 抽象子類
abstract class Polygon extends Shape //多邊形
{
abstract function getNumberOfSides();
}
//concrete class 實(shí)體類 三角形類
class Triangle extends Polygon
{
public $base;
public $height;
public function getArea() //覆寫計算面積方法
{
return(($this->base * $this->height)/2);
}
public function getNumberOfSides() //覆寫邊數(shù)統(tǒng)計方法
{
return(3);
}
}
//concrete class 實(shí)體類四邊形
class Rectangle extends Polygon
{
public $width;
public $height;
public function getArea()
{
return($this->width * $this->height);
}
public function getNumberOfSides()
{
return(4);
}
}
//concrete class 實(shí)體類 圓形
class Circle extends Shape
{
public $radius;
public function getArea()
{
return(pi() * $this->radius * $this->radius);
}
}
//concrete root class 定義一個顏色類
class Color
{
public $name;
}
$myCollection = array(); //建立形狀的集合,放入數(shù)組
//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類的實(shí)例
{
print("Area: " . $s->getArea() .
"<br>\n");
}
if($s instanceof Polygon)
{
print("Sides: " .
$s->getNumberOfSides() .
"<br>\n");
}
if($s instanceof Color)
{
print("Color: $s->name<br>\n");
}
print("<br>\n");
}
?>
相關(guān)文章
php動態(tài)實(shí)現(xiàn)表格跨行跨列實(shí)現(xiàn)代碼
由于按照條件提取多臺服務(wù)器生成的報表數(shù)據(jù)的需要,我們很可能用到php動態(tài)生成可以跨行跨列的表格,table跨行跨列雜糅在一起經(jīng)常出現(xiàn)不好控制,而且行列合并屬性的邏輯耦合度很高,所以對于這次的需要就有了如下東西2012-11-11
用PHP連接Oracle for NT 遠(yuǎn)程數(shù)據(jù)庫
用PHP連接Oracle for NT 遠(yuǎn)程數(shù)據(jù)庫...2006-10-10
第四節(jié)--構(gòu)造函數(shù)和析構(gòu)函數(shù)
第四節(jié)--構(gòu)造函數(shù)和析構(gòu)函數(shù)...2006-11-11
php單例模式實(shí)現(xiàn)(對象只被創(chuàng)建一次)
這是我在php面試題中遇到的一道試題,單例模式按字面來看就是某一個類只有一個實(shí)例,這樣做的好處還是很大的,比如說數(shù)據(jù)庫的連接,我們只需要實(shí)例化一次,不需要每次都去new了,這樣極大的降低了資源的耗費(fèi)2012-12-12

