最近發現自己 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)
}

 



arrow
arrow
    全站熱搜

    wbkuo 發表在 痞客邦 留言(1) 人氣()