最近發現自己 OO 的概念有些不是很正確,就稍微再惡補了解了一下
並使用的自己的語言來描述一次,如有錯誤請指正,謝謝!
以下是簡單的筆記:
1. 封裝(Encapsulation)
封裝就是把一些相近功能的變數、函式使用 class 包裝起來
然後將不能直接被其他程式存取的部份使用 private 或 protected 保護起來
使用 public 來指定開放給其他程式使用的 method
達到同一個功能都在同一個 class 裡面,以及變數保護的目的
2. 繼承(Inheritance)
繼承就是 class 的父子關係,使用 extends 可以繼承別的 class
然後就能直接繼承父層的方法及屬性,就像兒子繼承父親的遺產一樣
然後也可以繼承之後再用超載來覆寫掉原本的方法和屬性
達到所有的 class 共用一個父層 class 的程式
並各自超載或另外撰寫自己需要的部份。
範例
<?php // 車子的父類別 class car_base { protected $max_speed = 60; public function __construct($max_speed) { $this->max_speed = $max_speed; } public function run() { echo 'car run....! <br>'; } } // 車子的子類別 class car extends car_base { private $color; public function __construct($max_speed, $color) { parent::__construct($max_speed); $this->color = $color; } public function show_info() { echo "CAR: max_speed={$this->max_speed}, color={$this->color} <br>"; } } // 使用 car 類別 $vios = new car(200, "blue"); $vios->show_info(); $vios->run();
說明:
1. car_base 為父類別,擁有屬性 $speed 及 method run
2. car 為子類別,繼承 car_base,擁有父類別的屬性 $speed 及 method run ,以及自己的屬性 $color 及 method show_info
3. 多型(Polymorphism)
多型指的是基於同一份類別(Class)或介面(Interface) 去做不同實作的 class
因為是基於同一份介面,所以使用的時候只要照著介面去呼叫就可以了,不必去仔細了解 class 裡的實作。
<?php // 車子的父類別 abstract class car_base { abstract public function run(); } // 車子的子類別 class car extends car_base { public function run() { echo "Drive a Car...<br>"; } } // 機車的子類別 class Motocycle extends car_base { public function run() { echo "Riding a Motocycle...<br>"; } } // 使用 Car 類別 $vios = new Car(); $vios->run(); // 使用 Motocycle 類別 $rv150 = new Motocycle(); $rv150->run();
4. 超載(Overriding)
超載就是在子類別繼承了父類別之後,將父類別的方法再定義一次,把父類別的方法給覆蓋掉。
範例
<?php // 車子的父類別 class car_base { public function run() { echo "Parent's Car Run! <br>"; } } // 車子的子類別 class car extends car_base { // 超載父類別的 method public function run() { echo "Child's Car Run! <br>"; } } // 使用 car 類別 $vios = new car(); $vios->run(); /** * 結果: * Child's Car Run! */
5. 重載(Overloading)
重載目前 PHP 好像沒有實作這樣的特性,重載指的是在同一個 class 底下,定義很多相同名稱的 method
那呼叫時會依據呼叫的參數自動判斷符合哪一個 method 去進行叫用。
PHP 的話我覺得可以使用 $args 及 $argv 自已判斷參數的數量以及型態,也能達到同樣的功能。
以下是簡單的 Java 程式範例
class Arrays { static int binarySearch(byte[] a, byte key); static int binarySearch(byte[] a, int fromIndex, int toIndex, byte key) }
留言列表