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

Rất nhiều người khi học lập trình hướng đối tượng OOP rất hay nhầm lẫn giữa lớp trừu tượng abstract và interface, hãy đọc bài viết của mình để hiểu rõ hơn về interface trong OOP.

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

1. Interface là gì?

Interface trong lập trình hướng đối tượng là một khuôn mẫu cho phép bạn chỉ định các phương thức mà một lớp sẽ triển khai.

Các Interface giúp bạn dễ dàng sử dụng nhiều class khác nhau theo cùng một cách. Khi một hoặc nhiều class sử dụng cùng một Interface thì được gọi là "đa hình".

Để khai báo interface trong PHP chúng ta dùng từ khoá interface

Ví dụ

<?php
interface Person {
  public function getInfo();
  public function getInfo($name, $gender);
  public function getInfo() : string;
}
?>

2. Cách sử dụng Interface

Để triển khai một Interface, class phải sử dụng từ khóa implements.

Một class khi implements một Interface phải implements tất cả các phương thức của Interface đó.

Ví dụ

<?php
interface Animal {
  public function makeSound();
}

class Cat implements Animal {
  public function makeSound() {
    echo "Meow";
  }
}

$animal = new Cat();
$animal->makeSound();
?>

3. Tính chất của Interface

Interface không phải là một đối tượng vì thế không thể khởi tạo được Interface

Ví dụ

interface Animal
{
    //
}

//SAI vì interface không thể khởi tạo được
$dog = new Animal();

Trong Interface chúng ta chỉ được khai báo phương thức chứ không được định nghĩa chúng.

Ví dụ

interface Animal
{
    //ĐÚNG vì chúng ta chỉ khai báo phương thức trong interface
    public function setName();

    //SAI vì chúng ta không được định nghĩa phương thức trong interface
    public function getName()
    {
        //
    }
}

Trong Interface chúng ta có thể khai báo được hằng nhưng không thể khai báo biến.

Ví dụ

interface Animal
{
    //ĐÚNG vì trong interface có thể khai báo hằng
    const AGE = 100;

    //SAI vì trong interface không thể khai báo biến
    public $name;

}

Các class implement từ Interface thì phải khai báo và định nghĩa lại các phương thức có trong interface đó.

Ví dụ

interface Animal
{
    public function getName();
}

//Class này ĐÚNG vì đã khai báo và định nghĩa lại phương thức getName()có trong interface
class Dog implements Animal
{
    private $name;

    public function getName()
    {
        return $this->name;
    }
}

//Class này SAI vì chưa khai báo và định nghĩa lại phương thức getName() có trong interface
class Cat implements Animal
{
    private $name;

    public function setName($name)
    {
        $this->name = $name;
    }
}

Một class có thể implement nhiều interface.

Ví dụ

interface Animal
{
    public function getName();
}

interface Lion
{
    public function checkDie();
}

class Tiger implements Animal, Lion
{
    private $name;
    const IS_DIE = false;

    public function getName()
    {
        return $this->name;
    }

    public function checkDie()
    {
        return self::IS_DIE;
    }
}

Interface có thể kế thừa lẫn nhau.

Ví dụ

interface Animal
{
    public function getName();
}

interface Lion extends Animal
{
    public function checkDie();
}

class Tiger implements Lion
{
    private $name;
    const IS_DIE = false;

    public function getName()
    {
        return $this->name;
    }

    public function checkDie()
    {
        return self::IS_DIE;
    }
}

 

II. So sánh Interface và class abstract

1. Các điểm khác biệt giữa Interface và Class abstract

  • Các Interface không thể có thuộc tính, trong khi các class abstract thì có thể.
  • Tất cả các phương thức trong Interface phải là public, trong khi các phương thức trong class abstract có thể là public, hoặc protected
  • Tất cả các phương thức trong một Interface là abstract, vì vậy chúng không thể viết code trong đó mà chỉ có thể khai báo.
  • Các class có thể vừa implements một Interface đồng thời có thể kế thừa từ một class khác.

Ví dụ

<?php
// Ta có Interface Animal
interface Animal {
  const AGE = 10; // ĐÚNG
  public $name; // SAI 
  public function getName(); // ĐÚNG
  protected function setName(); // SAI
  public function getInfo()  // SAI
  {
    //
  }

}

// Ta có class abstract Animal
abstract class Animal {
  const AGE = 10; // ĐÚNG
  public $name; // ĐÚNG 
  public function getName(); // ĐÚNG
  protected function setName(); // ĐÚNG
  public function getInfo()  // SAI
  {
    //
  }

}

?>

2. Khi nào nên sử dụng Class abstract và Interface?

  • Abstract thường được sử dụng trong trường hợp các class kế thừa từ nó có cùng bản chất (thuộc 1 nhóm đối tượng).
  • Interface thường được sử dụng trong trường hợp các class kế thừa không có cùng bản chất (nhóm đối tượng) nhưng chúng có thể thực hiện các hành động giống nhau.

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