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

Một tính chất nữa của lập trình hướng đối tượng OOP là tính đa hình, đây là một tính chất cũng khá quan trọng bởi vì nó có thể được dùng để tạo ra luồng có hệ thống hơn cho ứng dụng của bạn.

I. Tìm hiểu tính đa hình trong lập trình hướng đối tượng OOP

1. Tính đa hình là gì?

Tính đa hình là sự đa hình của mỗi hành động cụ thể ở những đối tượng khác nhau. 

Khi có nhiều class con kế thừa class cha nhưng có những tính chất khác nhau cũng gọi là đa hình, hoặc khi có nhiều class cùng sử dụng một interface thì cũng được gọi là đa hình.

Ví dụ ta có class Animal trong đó có định nghĩa phương thức eat(), các class Rabbit, Lion kế thừa từ class Animal, tuy nhiên mỗi con vật lại ăn khác nhau, Rabbit thì ăn cà rốt, Lion thì ăn thịt nên ta sẽ dùng kỹ thuật ovewrite để viết lại phương thức eat() cho class Rabbit, Lion.

<?php

class Animal{
   public $name;
   public function setName($name){
     $this->name = $name;
   }
   public function eat(){
     echo "Con {$this->name} đang ăn ...";
   }
}
class Lion extends Animal{
   public function eat(){
     echo "Con {$this->name} đang ăn thịt thỏ";
   }
}
class Rabbit extends Animal{
   public function eat(){
     echo "Con {$this->name} đang ăn cà rốt";
   }
}

$lion = new Lion();
$lion->setName("Lion");
$lion->eat();
echo "</br>";
$rabbit = new Rabbit();
$rabbit->setName("Rabbit");
$rabbit->eat("Rabbit");
?>

Qua ví dụ trên có thể thấy tính đa hình luôn tồn tại song song với tính kế thừa.

2. Bản chất của tính đa hình

Bản chất của tính đa hình là kỹ thuật cho phép thay đổi nội dung cùng một hành vi (hàm) trong hai lớp cha và con, hay nói cách khác là viết lại hàm ở lớp cha trong lớp con.

Ví dụ ta có bài toán tính diện tích hình vuông, hình chữ nhật như sau

<?php
abstract class HinhHoc{
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  public function tieuDe(){
    echo "Dien tich hinh {$this->name} la: ";
  }
  abstract public function tinhDienTich();

}
class HinhVuong extends HinhHoc{
  public $canh = 1;
  public function ganDoDai($canh){
      $this->canh = $canh;
  }
  public function tinhDienTich(){
    $dienTich = $this->canh*$this->canh;
    return $dienTich;
  }
}
class HinhChuNhat extends HinhHoc{
  public $rong = 1;
  public $dai = 1;
  public function ganDoDai($rong,$dai){
      $this->rong = $rong;
      $this->dai = $dai;
  }
  public function tinhDienTich(){
    $dienTich = $this->rong*$this->dai;
    return $dienTich;
  }
}

$hinhVuong = new HinhVuong("Hinh Vuong");
$hinhVuong->tieuDe();
$hinhVuong->ganDoDai(4);
echo $hinhVuong->tinhDienTich();
echo "</br>";
$hinhChuNhat = new HinhChuNhat("Hinh Chu Nhat");
$hinhChuNhat->tieuDe();
$hinhChuNhat->ganDoDai(4,5);
echo $hinhChuNhat->tinhDienTich();
echo "</br>";
?>

Ví dụ trên đã sử dụng kỹ thuật ovewrite để viết lại các phương thức tinhDienTich(), ganDoDai() cho mỗi đối tượng Hình Vuông, Hình Chữ Nhật.

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