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

Một tính chất quan trọng khác trong lập trình hướng đối tượng OOP đó là tính kế thừa, vậy tính kế thừa là gì? Cùng tìm hiểu qua bài viết dưới đây nhé.

I. Tính kế thừa

Tính kế thừa trong lập trình hướng đối tượng cho phép một lớp (class) có thể kế thừa các thuộc tính và phương thức từ các lớp khác đã được định nghĩa.

Lưu ý: Thuộc tính và phương thức được kế thừa phải có mức truy cập public hoặc protected.

Lớp được kế thừa còn được gọi là lớp cha và lớp kế thừa được gọi là lớp con.

Một lớp kế thừa được định nghĩa bằng cách sử dụng expand.

Ví dụ ta có 1 lớp Strawberry được kế thừa từ lớp Fruit, lớp Strawberry sẽ được kế thừa luôn thuộc tính $name, $color, $price, $weight đồng thời cả phương thức __construct(), intro(), showPrice() nhưng không được thừa kế phương thức showWeight() vì phương thức này có mức private.

<?php
class Fruit {
  protected $name;
  protected $color;
  protected $price;
  protected $weight;
  public function __construct($name, $color,$price,$weight) {
    $this->name = $name;
    $this->color = $color;
    $this->price = $price;
    $this->weight = $weight;
  }
  public function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
  protected function showPrice(){
    echo "The fruit is {$this->name} has price is {$this->price}";
  }
  private function showWeight(){
    echo "The fruit is {$this->name} has weight is {$this->weight}";
  }
}

// Lớp Strawberry được kế thừa từ lớp Fruit
class Strawberry extends Fruit {
  public function message() {
    echo "Am I a fruit or a berry? ";
  }
  public function callShowPrice(){
    $this->showPrice(); // OK ==> Gọi được phương thức showPrice() vì mức truy cập protected
  }
}
$strawberry = new Strawberry("Strawberry", "red","2000","0.3kg");
$strawberry->message();   // OK vì mức truy cập public
$strawberry->callShowPrice(); // Ok vì mức truy cập public
$strawberry->intro();   // OK vì mức truy cập public
$strawberry->showPrice();   // ERROR vì mức truy cập protected
$strawberry->showWeight();   // ERROR vì mức truy cập private
?>

II. Ghi đè các phương thức kế thừa(Overriding)

Các phương thức kế thừa ở lớp cha có thể được ghi đè bằng cách định nghĩa lại các phương thức (sử dụng cùng một tên) trong lớp con.

Ví dụ ta có class Strawberry được kế thừa từ class cha Fruit, trong class con Strawberry có phương thức __construct, intro() đã ghi đè lên các phương thức __construct (), intro () trong class cha Fruit.

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  public function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}

class Strawberry extends Fruit {
  public $weight;
  public function __construct($name, $color, $weight) {
    $this->name = $name;
    $this->color = $color;
    $this->weight = $weight;
  }
  public function intro() {
    echo "The fruit is {$this->name}, the color is {$this->color}, and the weight is {$this->weight} gram.";
  }
}

$strawberry = new Strawberry("Strawberry", "red", 50);
$strawberry->intro();
?>

 

III. Ngăn không cho kế thừa, ghi đè

Nếu bạn không cho phép kế thừa, ghi đè bạn sử dụng final 

Ví dụ không cho class Strawberry kế thừa class Fruit

<?php
final class Fruit {
  // some code
}

// will result in error
class Strawberry extends Fruit {
  // some code
}
?>

Ví dụ không cho class Strawberry ghi đè phương thức intro() trong class Fruit

<?php
class Fruit {
  final public function intro() {
    // some code
  }
}

class Strawberry extends Fruit {
  // will result in error
  public function intro() {
    // some code
  }
}
?>

Bài viết nên đọc

Trên đây là những kiến thức từ kinh nghiệm bản thân mình nên các bạn có thể tham khảo. Nếu các bạn có góp ý cho mình thì hãy gửi vào đây, mình sẵn sàng nhận ý kiến đóng góp từ các bạn.

Ngoc Phuong

Ngoc Phuong - 82 bài viết - Đánh giá:

Có 2 cách học hiệu quả nhất, 1 là nói cho người khác biết thứ bạn mới học được, 2 là nói cho người khác biết thứ bạn sắp quên. Tôi mới học được rất nhiều thứ. Tôi cũng sắp quên rất nhiều thứ.

Để lại bình luận

Địa chỉ email của bạn sẽ không được công khai