Tính kế thừa trong lập trình hướng đối tượng

hướng đối tượng

Phần 4 : Tính kế thừa trong lập trình hướng đối tượng

Qua 3 bài giới thiệu về hướng đối tượng , tầm vực của thuộc tính và phương thức trong hướng đối tượng, các phương thức magic trong hướng đối tượng chúng ta đã học được kha khá kiến thức rồi, trước khi vào bài mới này, bạn cũng nên dành chút thời gian ôn lại bài cũ, đó là một cách học cuốn chiếu để cho bạn nhớ bài lâu hơn. Hôm nay mình sẽ hướng dẫn các bạn về tính kế thừa trong lập trình hướng đối tượng, đây gần như được coi là một trong những đặc điểm quan trọng, không thể thiếu của hướng đối tượng, thiếu tính kế thừa, hướng đối tượng sẽ không còn là hướng đối tượng mà nó sẽ trở thành một cái loài gì đó, mình cũng ko biết nữa 🙂

1) Kế thừa là gì ?

Một ví dụ đơn giản về tính kế thừa đó là trong gia đình, bạn được sinh ra chính là sự kế thừa các gen duy truyền của ba mẹ bạn chẳng hạn như màu tóc, màu mắt, chiều cao, nhóm máu,…Trong lập trình hướng đối tượng cũng thế, giả sử bạn có 1 class cha có các thuộc tính và phương thức nào đó, thì các class khác khi kế thừa class cha này (class con), thì nó sẽ thừa hưởng và tái sử dụng các phương thức, thuộc tính của class cha. Ví dụ dưới đây cho chúng ta thấy rõ hơn về sự kế thừa

<?php
/**
* tạo class ParentClass
*/
class ParentClass
{
    $eye_color = "đỏ";
    $skin_color = "đen";
    $height = "1m7";
    
    function __construct()
    {
        echo "Tôi chính là class ParentClass! <br />";
    }
}

/**
* tạo class ChildClass kế thừa lớp cha ParentClass
*/
class ChildClass extends ParentClass
{
    
    function __construct(argument)
    {
        echo "Tôi là lớp ChildClass, tôi kế thừa từ cha tôi đó là class ParentClass <br />";
    }
}
//Tạo object $childClass
$childClass = new ChildClass;
echo "Tôi được thừa hưởng màu mắt từ cha tôi đó là màu ".$childClass->eye_color;
?>

Save đoạn code trên và thực thi, chúng ta sẽ thấy xuất ra ngoài trình duyệt

Tôi là lớp ChildClass, tôi kế thừa từ cha tôi đó là class ParentClass
Tôi được thừa hưởng màu mắt từ cha tôi đó là màu đỏ

Phân tích đoạn code trên ta thấy (hè, giống tập làm văn quá :3), lớp ChildClass muốn kế thừa lớp ParentClass, nó sẽ sử dụng từ khóa extends, khi kế thừa, lớp này sẽ thừa hưởng được các đặc tính của lớp cha, như là màu mắt, màu da, chiều cao. chính vì thế khi khởi tạo đối tượng $childClass, chúng ta có thể truy xuất được ngay đến thuộc tính $eye_color thông quá $childClass->eye_color.

2) Override trong hướng đối tượng

Overide hay còn gọi là nạp chồng, đây là kĩ thuật ghi đè thuộc tính của lớp cha bởi lớp con. Trở lại ví dụ ở mục 1), các bạn có để ý thấy khi chạy đoạn code trên, chỉ xuất ra 2 dòng đó là :

Tôi là lớp ChildClass, tôi kế thừa từ cha tôi đó là class ParentClass
Tôi được thừa hưởng màu mắt từ cha tôi đó là màu đỏ

Vậy thì dòng Tôi chính là class ParentClass! chạy đâu mất tiêu rồi ? Đó là bởi vì trong class con là ChildClass kế thừa từ lớp cha là ParentClass, nó vô tình cũng có phương thức __contruct, và cũng vô tình nó đã ghi đè lên phương thức __contruct của lớp cha, chính vì thế khi thực thi, ngoài trình duyệt chỉ hiện ra dòng chữ “Tôi là lớp ChildClass, tôi kế thừa từ cha tôi đó là class ParentClass”. Từ ví dụ trên, ta rút ra kết luận, để thay đổi thuộc tính hay phương thức của lớp cha, thì trong lớp con bạn chỉ cần khởi tạo lại chính đặc tính của lớp cha (đặt trùng tên phương thức, thuộc tính) là bạn sẽ ghi đề được lớp cha. Thêm 1 ví dụ nữa sau đây để bạn dễ hình dung hơn về tính override

<?php
/**
* tạo class ParentClass
*/
class ParentClass
{
    $eye_color = "đỏ";
    $skin_color = "đen";
    $height = "1m7";
    
    function __construct()
    {
        echo "Tôi chính là class ParentClass! <br />";
    }
    function run(){
        echo "Ba chạy được 30km/h <br />";
    }
}

/**
* tạo class ChildClass kế thừa lớp cha ParentClass
*/
class ChildClass extends ParentClass
{
    
    function __construct(argument)
    {
        echo "Tôi là lớp ChildClass, tôi kế thừa từ cha tôi đó là class ParentClass <br />";
    }
    function run(){
        echo "Con chạy được 40km/h";
    }
}
//Tạo object $childClass
$childClass = new ChildClass;
$childClass->run();
?>

Kết quả

Tôi là lớp ChildClass, tôi kế thừa từ cha tôi đó là class ParentClass
Con chạy được 40km/h

3) Bảo vệ lớp cha khỏi bị ghi đè

Trong trường hợp lớp con ChildClass muốn kế thừa lớp cha, nhưng vẫn muốn giữ lại đặc tính của lớp cha
thì ta phải làm như thế nào, đơn giản chúng ta chỉ cần làm theo cú pháp

từ khóa parent + toán từ phân giải phạm vi (::)

Ví dụ

<?php
/**
* tạo class ParentClass
*/
class ParentClass
{
    $eye_color = "đỏ";
    $skin_color = "đen";
    $height = "1m7";
    
    function __construct()
    {
        echo "Tôi chính là class ParentClass! <br />";
    }
    function run(){
        echo "Ba chạy được 30km/h <br />";
    }
}

/**
* tạo class ChildClass kế thừa lớp cha ParentClass
*/
class ChildClass extends ParentClass
{
    
    function __construct(argument)
    {
        echo "Tôi là lớp ChildClass, tôi kế thừa từ cha tôi đó là class ParentClass <br />";
    }
    function run(){
        parent::run();
        echo "Con chạy được 40km/h";
    }
}
//Tạo object $childClass
$childClass = new ChildClass;
$childClass->run();
?>

Thực thi đoạn code trên sẽ xuất ra như sau:

Tôi là lớp ChildClass, tôi kế thừa từ cha tôi đó là class ParentClass
Ba chạy được 30km/h
Con chạy được 40km/h

Hôm nay viết tới đây là đủ rồi, phew phew, hơi mệt nhưng vui, nếu bạn đã có kiên nhẫn đọc hết bài viết thì không tiếc gì chút ít thời gian  click vào các nút bên dưới để share bài viết để trang web được nhiều người biết tới hơn, và mình sẽ cố gắng viết thật nhiều bài chất lượng để chúng ta cùng: “chia sẽ nhiều hơn – phát triển nhiều hơn”. Thân ^^

Nguon : kungfuphp.com

Hiếu

"Những người điên rồ tới mức nghĩ mình có thể thay đổi được thế giới chính là những người có thể làm được điều đó" _ Steve Job

Subscribe
Notify of
guest

4 Bình Luận
Inline Feedbacks
Xem Tất Cả Bình Luận
son truong
son truong
5 năm trước

<?php Class ParentClass { public $eye_color = "do"; public $skin_color = "den"; public $height = "1m7"; function __construct() { echo "Toi chinh la Class ParentClass !”; } } Class ChildClass extends ParentClass { function __construct() { echo “Toi la lop ChildClass, toi ke thua tu cha toi do la class ParentClass”; } } $childClass = new ChildClass; echo “Toi duoc thua huong mau mat tu cha toi do la mau “.$childClass->eye_color; ?> // public $eye_color = “do”; public $skin_color = “den”; public $height = “1m7”; Cho hỏi tôi không dùng public thì bị báo lỗi. Parse error: syntax error, unexpected… Read more »

MinToo
MinToo
8 năm trước

function __construct(argument) ——> function __construct() thì chạy đc.sửa lại chút xíu 🙂

MinToo
MinToo
8 năm trước

<?php /** * tạo class ParentClass */ class ParentClass { $eye_color = "đỏ"; $skin_color = "đen"; $height = "1m7"; function __construct() { echo "Tôi chính là class ParentClass! “; } } /** * tạo class ChildClass kế thừa lớp cha ParentClass */ class ChildClass extends ParentClass { function __construct(argument) { echo “Tôi là lớp ChildClass, tôi kế thừa từ cha tôi đó là class ParentClass “; } } //Tạo object $childClass $childClass = new ChildClass; echo “Tôi được thừa hưởng màu mắt từ cha tôi đó là màu “.$childClass->eye_color; ?> báo lỗi: Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION… Read more »

Hùng
Hùng
8 năm trước

Thanks bạn bài viết ngắn gọn, dể hiểu

error: Content is protected !!
4
0
Bạn có ý kiến về bài viết, hãy để lại bình luận nhé!x
()
x