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

Thêm một tính chất cũng quan trọng không kém khi nhắc đến lập trình hướng đối tượng OOP đó là tính trừu tượng. Vậy tính trừu tượng trong lập trình hướng đối tượng OOP là gì?

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

1. Tính trừu tượng là gì?

Tính trừu tượng trong lập trình hướng đối tượng OOP là cách chỉ đưa ra vấn đề mà không cần chi tiết, chỉ hiển thị tính năng thiết yếu đối với đối tượng người dùng mà không cần quy trình hoạt động.

Ví dụ khi xây dựng chương trình quản lý Sinh Viên ta chỉ cần quan tâm các thông tin chính như là họ tên, giới tính, địa chỉ chứ không nhất thiết phải thêm các thông tin khác như là chiều cao, cân nặng, sở thích ... Lý do ta không cần các thông tin phụ kia là vì ta đang tìm, nạp, xoá dữ liệu thông tin Sinh Viên từ một nhóm lớn hơn có thể là nhóm Con Người chẳng hạn. Từ nhóm Con Người ta có thể xây dựng các nhóm khác ngoài Sinh Viên như là Giảng Viên, Nhân Viên.

Quá trình trên gọi là trừu tượng hoá.

2. Sử dụng tính trừu tượng khi nào?

Tính trừu tượng thường được sử dụng trong trường hợp các class con kế thừa từ class cha có cùng bản chất với nhau (thuộc 1 nhóm đối tượng).

Ví dụ ta có class trừu tượng Animal và các class kế thừa là Dog, Cat...

II. Lớp trừu tượng(class abstract) và phương thức trừu tượng(method abstract)

Lớp trừu tượng(class abstract) là một lớp có thể có chứa phương thức abstract hoặc không.

Một phương thức abstract là một phương thức được khai báo hay định nghĩa nhưng không được viết code bên trong.

Để khai báo lớp hoặc phương thức abstract ta sử dụng abstract

Ví dụ 

<?php
abstract class Person {
  // Khai báo phương thức abstract
  abstract public function info();  // Cách 1
  abstract public function info($name);  // Cách 2
  abstract public function info() : string; // Cách 3
}
?>

Lưu ý:

  • Khi kế thừa từ một class abstract, phương thức ở class con phải được định nghĩa cùng một tên và cùng một mức quyền truy cập hoặc rộng hơn. Có nghĩa là nếu phương thức abstract ở class cha được định nghĩa là protected thì phương thức ở class con phải được định nghĩa là protected hoặc public.
  • Ngoài ra, kiểu dữ liệu và số lượng đối số bắt buộc cũng phải giống nhau. Tuy nhiên, các class con có thể có các đối số tùy chọn khác.

Ví dụ ta có lớp abstract cha là Car bên trong có phương thức abstract intro() có kiểu trả về là string. Khi các class con Audi, Volvo, Citroen được kế thừa từ class abstract Car ta phải định nghĩa lại phương thức intro() giống với class abstract Car rồi mới viết code bên trong đó.

<?php
// class cha
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() : string;
}

// class con
class Audi extends Car {
  public function intro() : string {
    return "Choose German quality! I'm an $this->name!";
  }
}

class Volvo extends Car {
  public function intro() : string {
    return "Proud to be Swedish! I'm a $this->name!";
  }
}

class Citroen extends Car {
  public function intro() : string {
    return "French extravagance! I'm a $this->name!";
  }
}

// Tạo đối tượng từ các class con
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>

 

III. Những điểm cần lưu ý khi sử dụng lớp trừu tượng(class abstract) và phương thức abstract

1. Các phương thức khi được khai báo là abstract thì chỉ được định nghĩa chứ không được phép viết code xử lý bên trong. 

abstract class Person
{
    //Khai báo một phương thức abstract đúng
    abstract public function getInfo();

    //Sai vì không thể viết code bên trong phương thức được khai báo là abstract
    abstract public function getInfo()
    {
        //
    }
}

2. Trong lớp abstract nếu không phải là phương thức abstract thì vẫn khai báo và viết code được như bình thường.

abstract class Person
{
    // Phương thức getInfo() không được khai báo là phương thức abstract nên được phép viết code bên trong như bình thường
    public function getInfo()
    {
        //
    }
}

3. Phương thức abstract chỉ có thể khai báo trong abstract class.

class Person
{
    //Sai vì không thể khai báo một phương thức absract trong class bình thường.
    abstract public function getInfo();
}

4. Các thuộc tính trong abstract class thì không được khai báo là abstract.

class Person
{
    //SAI vì không được phép khai báo thuộc tính là abstract
    abstract public $name;
	//ĐÚNG
	public $name;
}

5. Không thể khởi tạo một abstract class

abstract class Person
{
    //body
}
//SAI vì không được phép khởi tạo abstract class
$person= new Person();

6. Các class kế thừa từ một abstract class thì phải định nghĩa lại tất cả các phương thức trong abstract class đó.

abstract class Person
{
    protected $name;

    abstract protected function getInfo();
}

//class này SAI vì chưa định nghĩa lại phương thức abstracs getInfo
class Student extends Person
{
    //
}

//class này ĐÚNG vì đã định nghĩa lại đầy đủ các phương thức abstract
class Teacher extends Dongvat
{
    public function getInfo()
    {
        return $this->name;
    }
}

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