โปรแกรมเชิงวัตถุถูกสร้างขึ้นผ่านโครงสร้างลำดับชั้นของคลาส ในภาษาที่สืบทอดเดี่ยว เช่น PHP การสืบทอดคลาสจะมีลักษณะคล้ายต้นไม้ คลาสรูทมีคลาสย่อยตั้งแต่หนึ่งคลาสขึ้นไป จากนั้นคลาสย่อยอย่างน้อยหนึ่งคลาสจะถูกสืบทอดจากแต่ละคลาสย่อย . หมวดหมู่ย่อยระดับถัดไปเพิ่มเติม แน่นอนว่าอาจมีคลาสรูทหลายคลาสที่ใช้เพื่อใช้งานฟังก์ชันที่แตกต่างกัน ในสถาปัตยกรรมที่ออกแบบมาอย่างดี แต่ละคลาสรูทควรมีอินเทอร์เฟซที่มีประโยชน์ซึ่งโค้ดของแอปพลิเคชันสามารถใช้ได้ หากโค้ดแอปพลิเคชันของเราได้รับการออกแบบให้ทำงานกับคลาสรูท ก็ยังสามารถทำงานกับคลาสย่อยใดๆ ที่สืบทอดมาจากคลาสรูทได้เช่นกัน
วิธีการแบบนามธรรมนั้นเหมือนกับตัวยึดตำแหน่งสำหรับวิธีปกติในคลาสย่อย (มันใช้พื้นที่แต่ไม่มีผลกระทบ) แต่ไม่เหมือนกับวิธีปกติตรงที่ไม่มีโค้ดใดๆ หากมีวิธีการเชิงนามธรรมตั้งแต่หนึ่งวิธีขึ้นไปในชั้นเรียน ชั้นเรียนนั้นจะกลายเป็นคลาสนามธรรม คุณไม่สามารถสร้างอินสแตนซ์ของคลาสนามธรรมได้ คุณต้องสืบทอดจากคลาสเหล่านั้นแล้วจึงสร้างคลาสย่อยขึ้นมา
หากคุณแทนที่วิธีนามธรรมทั้งหมด คลาสย่อยจะกลายเป็นคลาสปกติ หากวิธีการทั้งหมดไม่ถูกแทนที่ คลาสย่อยยังคงเป็นนามธรรม หากคลาสมีวิธีนามธรรม (แม้ว่าจะมีวิธีเดียว) คุณต้องประกาศคลาสให้เป็นนามธรรมโดยการเพิ่ม abstract ก่อนคีย์เวิร์ดของคลาส
ไวยากรณ์ของการประกาศวิธีนามธรรมแตกต่างจากวิธีประกาศวิธีทั่วไป โดยวิธีนามธรรมไม่มีเนื้อหาหลักอยู่ในเครื่องหมายปีกกา {} เหมือนวิธีทั่วไป และลงท้ายด้วยเครื่องหมายอัฒภาค
ในตัวอย่าง 6.13 เรากำหนดคลาส Shape ที่มีเมธอด getArea แต่เนื่องจากเป็นไปไม่ได้ที่จะกำหนดพื้นที่ของรูปโดยไม่ทราบรูปร่าง เราจึงประกาศวิธี getArea เป็นวิธีนามธรรม คุณไม่สามารถสร้างอินสแตนซ์ของวัตถุ Shape ได้ แต่คุณสามารถสืบทอดจากวัตถุนั้นหรือใช้ในนิพจน์ได้ ดังตัวอย่างที่ 6.13
หากคุณสร้างคลาสด้วยเมธอดนามธรรมเท่านั้น คุณจะกำหนดอินเทอร์เฟซ เพื่อแสดงให้เห็นสถานการณ์นี้ PHP มีอินเทอร์เฟซและใช้งานคำหลัก คุณสามารถใช้อินเทอร์เฟซแทนคลาสนามธรรมและนำไปใช้แทนการขยายเพื่ออธิบายคำจำกัดความของคลาสของคุณหรือใช้อินเทอร์เฟซ ตัวอย่างเช่น คุณสามารถเขียน myClass นำไปใช้ myIterface คุณสามารถเลือกระหว่างสองวิธีนี้ตามการตั้งค่าส่วนตัว
/*บันทึก:
ทั้งสองวิธีอ้างถึง:
1. abstract class aaa{} (โปรดทราบว่ามีเฉพาะวิธี abstract ใน aaa เท่านั้น ไม่มีวิธีทั่วไป)
class bbb ขยาย aaa{} (แทนที่วิธีนามธรรมใน aaa ใน bbb)
2. อินเทอร์เฟซ aaa{}
คลาส bbb นำไปใช้ aaa{} (แทนที่วิธีนามธรรมใน aaa ใน bbb)
*/
รายการ 6.13 คลาสนามธรรม
//คลาสรูทนามธรรม คลาสรูทนามธรรม
รูปร่างคลาสนามธรรม
-
ฟังก์ชันนามธรรม getArea(); //กำหนดวิธีการแบบนามธรรม
}
//คลาสย่อยนามธรรมของคลาสเด็กนามธรรม
รูปหลายเหลี่ยมคลาสนามธรรมขยายรูปร่าง // รูปหลายเหลี่ยม
-
ฟังก์ชันนามธรรม getNumberOfSides();
}
//คลาสคอนกรีต คลาสเอนทิตี คลาสสามเหลี่ยม
คลาส Triangle ขยายรูปหลายเหลี่ยม
-
ฐาน $ สาธารณะ;
public $height;
public function getArea() //แทนที่วิธีการคำนวณพื้นที่{
return(($this->base * $this->height)/2);
}
ฟังก์ชั่นสาธารณะ getNumberOfSides() //แทนที่วิธีนับด้าน{
กลับ(3);
-
}
//คอนกรีตคลาสเอนทิตีคลาสรูปสี่เหลี่ยมขนมเปียกปูน
คลาสสี่เหลี่ยมผืนผ้าขยายรูปหลายเหลี่ยม
-
ความกว้าง $ สาธารณะ;
สาธารณะ $height;
ฟังก์ชั่นสาธารณะ getArea()
-
return($this->width * $this->height);
}
ฟังก์ชั่นสาธารณะ getNumberOfSides()
-
กลับ(4);
-
}
//สร้างวงกลมคลาสเอนทิตีคลาสคอนกรีต
คลาส Circle ขยายรูปร่าง
-
สาธารณะ $radius;
getArea() ฟังก์ชั่นสาธารณะ
-
return(pi() * $this->รัศมี * $this->รัศมี);
-
}
//คลาสรูตคอนกรีตกำหนดคลาสสี
คลาสสี
-
ชื่อ $ สาธารณะ;
}
$myCollection = array(); //สร้างคอลเลกชันของรูปร่างและใส่ไว้ในอาร์เรย์
//สร้างรูปสี่เหลี่ยมผืนผ้า
$r = สี่เหลี่ยมผืนผ้าใหม่;
$r->ความกว้าง = 5;
$r->ความสูง = 7;
$myCollection[] = $r;
unset($r);
//สร้างรูปสามเหลี่ยม
$t = สามเหลี่ยมใหม่;
$t->ฐาน = 4;
$t->ความสูง = 5;
$myCollection[] = $t;
unset($t);
//สร้างวงกลม
$c = แวดวงใหม่;
$c->รัศมี = 3;
$myCollection[] = $c;
unset($c);
//สร้างสี
$c = สีใหม่;
$c->ชื่อ = "สีฟ้า";
$myCollection[] = $c;
unset($c);
foreach($myCollection เป็น $s)
-
if($s instanceof Shape) //ถ้า $s เป็น instance ของคลาส Shape{
พิมพ์("พื้นที่: " . $s->getArea() . "n");
}
if($s อินสแตนซ์ของรูปหลายเหลี่ยม)
-
พิมพ์("ด้าน: " .$s->getNumberOfSides().."n");
}
if($s อินสแตนซ์ของสี)
-
print("สี: $s->ชื่อ n");
}
พิมพ์("n");
}
?>