hướng đối tượng

Lớp giao diện và lớp trừu tượng

Phần 5 : Lớp giao diện và lớp trừu tượng

Trải qua 4 bài viết về lập trình hướng đối tượng, ắt hẳn các bạn cũng đã có kha khá kiến thức cho mình rồi. Hôm nay mình sẽ tiếp tục gửi đến các bạn bài viết hơi nâng cao chút xíu trong chuỗi serials bài viết về hướng đối tượng trong PHP, đó là “Abstract và Interface trong hướng đối tượng”. Trong bài viết này mình sẽ cố gắng viết thật chi tiết và dễ hiểu để giải thích được tường tận ngóc ngách vấn đề cho các bạn đã đang và sẽ băn khoăn về lớp trừu tượng và giao diện trong PHP.

1) Lớp trừa tượng (abstract) OOP

Lớp trừu tượng (abtract) là gì? Lớp trừu tượng trước tiên nó chính là 1 lớp (điều này thì hiển nhiên rồi 🙂 ), nhưng nó được gọi là lớp trừu tượng bởi vì :

– Lớp này sẽ chứa các phương thức trừa tượng.
– Các lớp khác khi kế thừa lớp trừu tượng sẽ phải định nghĩa các phương thức trừu tượng ấy.
– Một class chỉ có thể kế thừa 1 lớp trừu tượng.

Ví du 1 :

<?php
//Định nghĩa lớp trừu tượng động vật có vú
   abstract class Mamal{
       //Định nghĩa các phương thức chung của lớp Mamal
      abstract public function setAge($age);
      abstract public function getAge();
      abstract public function eat($food);
   }
?>

Lúc này có thể hiểu rằng, lớp Mamal được gọi là lớp trừu tượng và các phương thức setAge($age), getAge($age), eat($food) chính là phương thức trừu tượng. Và khi một lớp nào đó muốn sử dụng lớp trừu tượng, thì nó phải kế thừa sử dụng từ khóa extends

<?php
   //Định nghĩa lớp trừu tượng động vật có vú
   abstract class Mamal{
       //Định nghĩa các phương thức chung của lớp Mamal
      abstract public function setAge($age);
      abstract public function getAge();
      abstract public function eat($food){
        echo "Bạn muốn ăn gì?";
      }
   }

   class Person extends Mammal {
      protected $job_;
      public function setAge($age){
        $this->age_ = $age;
      }

      public function getAge(){
        return $this->age_;
      }

      public function eat($food){
        echo 'Tôi muốn ăn chay ngày hôm nay';
      }

      public function setJob($job){
         $this->job_ = $job;
      }
      public function getJob(){
         echo 'Công việc của tôi là '.$this->job_;
      }

}
?>

Phân tích ví dụ trên, ta thấy rằng, khi một lớp đó là Person kế thừa lại lớp Mamal, nó phải định nghĩa lại các phương thức có trong lớp trừu tượng Mamal như là : setAge(), getAge(), eat(). Ngoài ra class Person cũng sẽ tự định nghĩa cho mình các phương thức khác như setJob(), getJob,…

Đến đây bạn đã có thể hình dung rõ ràng về lớp trừu tượng chưa? Nếu vẫn chưa thì các bạn ghi nhớ lại những điều sau đây:

Thứ 1 : Lớp trừu tượng sẽ chứa các phương thức trừa tượng.
Thứ 2 : Các lớp khác khi kế thừa lớp trừu tượng sẽ phải định nghĩa các phương thức trừu tượng ấy.
Thứ 3 :  Một class chỉ có thể kế thừa 1 lớp trừu tượng.

Vậy mục đích của lớp trừu tượng là gì ?
Đó là, trong lập trình, khi bạn (hoặc một người nào đó) xây dựng một hệ thống website, và trong quá trình xây dựng (code) lên hệ thống ấy, bạn muốn ép buộc người lập trình phải tuân thủ theo một số các phương thức và các phương thức này đã được định nghĩa sẵn những thứ cơ bản, để giúp cho lập trình viên có thể kế thừa các phương thức này và phát triển lớp con của họ.

2) Giao diện (interface) trong PHP

Giao diên (interface) cũng mang nguyên tắc của lớp trừu tượng (abstract), nhưng điều khác biệt đó là một lớp con có thể được phép sử dụng nhiều lớp giao diện (ngược với abstract, 1 lớp con chỉ sử dụng đặc tính 1 lớp cha). Nói 1 cách để các bạn dễ hình dung đó là interface giống những những công cụ tiện ích có sẵn nhưng chưa được sử dụng, và khi một ai đó muốn làm một công việc nào đó, họ sẽ sử dụng các công cụ này, hiện thực hóa nó vì một mục đích của họ. Chẳng hạn như bạn muốn xây một cái chuồng gà, bạn cần các công cụ như là búa, dao, cưa,…Ví dụ dưới đây demo cho các bạn:
Ví dụ 2

<?php
  //Giao diện búa có khả năng đóng đinh
   interface bua{
        function dongdinh();
   }
  //Giao diện cưa có khả năng cưa gỗ
   interface cua{
        function cuago()
   }

   class ChuongGa implements bua,cua{
     
     function __construct(argument){
        echo "Xây chuồng gà";
     }
     //dùng cái búa đóng đinh
     function dongdinh(){
      echo "Đóng đinh chuồng gà";
     }
     function cuago(){
      echo "Cưa gỗ để xây chuồng";
     }
   }
?>

Ở ví dụ trên , ta thấy rõ sự khác biệt giữa lớp abtract và interface đó là:

– interface đem lại sự lựa chọn nhiều hơn.
– bạn có thể định nghĩa phương thức trong lớp trừa tượng (như ví dụ 1 lớp phương thức eat có thể được định nghĩa) còn lớp interface thì không được phép làm điều đó

Ngoài ra, 1 lớp có thể kế thừa 1 lớp trừu tượng và sử dụng nhiều lớp giao diện như ví dụ dưới đây

<?php
   interface water{
          public function makeItWet();
    }
   class weather{
          public function start(){
               return 'Here is some weather';
          }
    }
    class rain extends weather implements water{
           public function makeItWet(){
                 return 'It is wet';
           }
    }
   $a = new rain();
   echo $a->start();
   echo $a->makeItWet()
?>

Kết thúc phần 5 trong chuỗi serials hướng đối tượng, nếu bạn vẫn chưa thực sự hiểu rõ tường tận các vấn đề thì hãy ôn lại các bài trước 1 lần nữa hoặc để lại comment bên dưới, mình sẽ giải đáp thắc mắc của bạn và đừng quên chia sẽ bài viết cho bạn bè của bạn, để chúng ta cùng nhau học và cùng nhau phát triển nhé!

Nguon : kungfuphp.com

Có ích

hướng đối tượng trong PHP

Hướng đối tượng trong PHP

Hướng đối tượng trong PHP là gì ? Tại sao lại sử dụng hướng đối …

2 bình luận

  1. Quá hay ạ, cảm ơn kungfuphp

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *