2013-06-18 28 views
9

tôi có 2 lớp:PHP - mở rộng phương pháp như mở rộng một lớp

class animal{ 
    public function walk(){ 
     walk; 
    } 
} 

class human extends animal{ 
    public function walk(){ 
     with2legs; 
    } 
} 

Bằng cách này, nếu tôi gọi do con người> đi bộ(), nó chỉ chạy with2legs;

Nhưng tôi muốn chạy chương trình đi bộ của bố mẹ; quá.

Tôi biết tôi có thể sửa đổi nó theo cách này:

class human extends animal{ 
    public function walk(){ 
     parent::walk(); 
     with2legs; 
    } 
} 

Nhưng vấn đề là, tôi có nhiều lớp con và tôi không muốn đưa mẹ đi bộ ::(); vào mỗi đứa trẻ đi bộ(). Có cách nào tôi có thể mở rộng một phương pháp như tôi mở rộng một lớp học? Không ghi đè nhưng thực sự mở rộng phương pháp. Hoặc là có lựa chọn thay thế tốt hơn?

Cảm ơn.

Trả lời

19

Tôi sẽ sử dụng "hook"abstraction khái niệm:

class animal{ 

    // Function that has to be implemented in each child 
    abstract public function walkMyWay(); 

    public function walk(){ 
     walk_base; 
     walkMyWay(); 
    } 
} 

class human extends animal{ 
    // Just implement the specific part for human 
    public function walkMyWay(){ 
     with2legs; 
    } 
} 

class pig extends animal{ 
    // Just implement the specific part for pig 
    public function walkMyWay(){ 
     with4legs; 
    } 
} 

Bằng cách này tôi chỉ cần gọi:

// Calls parent::walk() which calls both 'parent::walk_base' and human::walkMyWay() 
$a_human->walk();  
// Calls parent::walk() which calls both 'parent::walk_base' and pig::walkMyWay() 
$a_pig->walk(); 

để làm cho một đứa trẻ đi theo cách của mình ...


Xem Template method pattern.


+0

Điều này thật tuyệt, tôi chưa bao giờ nghĩ gọi phương thức con từ cha mẹ! – Tony

+0

Vâng, đó là thiết kế tôi thường sử dụng. Khá tiện dụng trong một số trường hợp. –

+1

@OneTrickPony Tôi không biết Tony mong đợi điều gì và trường hợp sử dụng thực sự của anh ta đã đẩy anh ta hỏi câu hỏi này, nhưng đây là một cách để làm. Và tồi tệ nhất, ông phát hiện ra một khả năng mới ;-). Giờ ngủ cho tôi ... Chúc mừng! –