Các Đối Tượng Trong Trong Thế Giới Thực

Hành Động:

- Thêm Sinh Viên

- Đuổi Sinh Viên

- Đăng ký học phần cho Sinh Viên

- …

Ta thấy nhiều thuộc tính và hành động của sinh viên nhưng khi lưu vào hệ thống ta phải trừu tượng hóa lại cơ sở dữ liệu, tức là sàng lọc thuộc tính, hành động cần thiết cho phần mềm quản lý sinh viên, bỏ đi những thuộc tính không, hành động không cần thiết.

Tóm lại: Trừu tượng hóa dữ liệu là quá trình tổ chức một bài toán phức tạp thành những đối tượng có cấu trúc chặt chẽ, trong đó các dữ liệu và hành động của đối tượng được định nghĩa. Trong đối tượng dữ liệu và hành động có sự gắn kết chặt chẽ với nhau.

Đối tượng trong thế giới thực và trong lập trình

Đối tượng trong thế giới thực: là một thực thể mà ta có thể sờ, nhìn thấy và cảm nhận được. Mỗi đối tượng đều có những thuộc tính, hành động riêng biệt.

Ví dụ:

Có thể bạn quan tâm!

Xem toàn bộ 270 trang tài liệu này.

Hình 2 16 Các đối tượng trong trong thế giới thực Đối tượng trong lập 1

Hình 2.16. Các đối tượng trong trong thế giới thực

Đối tượng trong lập trình: Dùng để mô tả, biểu diễn đối tượng trong thế giới thực, nó cũng có các thuộc tính hành động tác động lên nó (tác động lên dữ liệu).

Ví dụ:Lớp đối tượng mô tả con chó

class Dog{

// Thuộc Tính var $ten = ''; var $mau = ''; var $giong = '';

// Hành Động function sua(){

// lệnh

}

function vay_tai(){

// lệnh

}

function chay(){

// chạy

}

function an(){

// ăn

}

}

2.11.4. Tính kế thừa

Tính kế thừa là một trong ba tính chất quan trọng của lập trình hướng đối tượng, nó đòi hỏi sự logic và trình độ của một lập trình viên mới có thể design partern được một mô hình chuẩn trong lập trình oop.

1) Tính kế thừa

Giả sử có 2 lớp là lớp Động Vật và lớp Con Trâu có những thuộc tính và phương thức sau:

Nhìn vào hình ta thấy hai đối tượng Động Vật và Con Trâu có những đặc 2

Nhìn vào hình ta thấy hai đối tượng Động Vật và Con Trâu có những đặc điểm chung và riêng. Đối tượng Con trâu chỉ có một đặc tính khác đó là nó có sừng, còn đối tượng động vật thì không có. Vậy ta có nhận xét như sau: Con trâu cũng là một động vật nên nó có những đặc tính của động vật, hay nói cách khác nó có tính kế thừa những đặc điểm và hành động của động vật.

Đấy là ta đang nói đến tính kế thừa của các đối tượng trong thế giới thực, còn trong lập trình thì như thế nào? Khai báo 2 lớp đối tượng trong php.

Lớp động vật:

class DongVat{

// Thuộc Tính var $mat = ''; var $mui = ''; var $mieng = ''; var $chan = '';

var $gioitinh = '';

// Hàm, phương thức function an(){

// lệnh

}

function ngu(){

// lệnh

}

function chay(){

// lệnh

}

function lahet(){

// lệnh

}

}

Lớp con trâu:

class ConTrau{

// Thuộc Tính

var $mat = ''; var $mui = '';

var $mieng = ''; var $chan = ''; var $gioitinh = '';

// Thuộc tính này khác với động vật var $sung = ''; // con trâu có sừng

// Hàm, phương thức function an(){

// lệnh

}

function ngu(){

// lệnh

}

function chay(){

// lệnh

}

function lahet(){

// lệnh

}

}

Rò ràng hai đối tượng Động Vật và Con Trâu có những thuộc tính và phương thức giống nhau tại sao ta lại phải khai báo hai đối tượng dài như vậy? Vì thế trong lập trình hướng đối tượng cung cấp chúng ta một tính chất để giải quyết vấn đề này đó là tính kế thừa.

Cú pháp như sau:

class classCon extends classCha {


}

Sau khi khai báo như vậy classCon sẽ có tất cả những thuộc tính, phương thức của classCha nên nó không cần phải viết lại.

Bài toán trên sẽ viết lại dưới dạng kế thừa như sau:

// Lớp Cha class DongVat{

// Thuộc Tính var $mat = ''; var $mui = ''; var $mieng = ''; var $chan = '';

var $gioitinh = '';

// Hàm, phương thức function an()

{

// lệnh

}

function ngu()

{

// lệnh

}

function chay(){

// lệnh

}

function lahet(){

// lệnh

}

}

// Lớp Con

class ConTrau extends DongVat{

// Tất cả các thuộc tính khác đều kế thừa từ cha

// nên không cần viết lại

// chỉ riêng thuộc tính này là cha không có nên ta phải khai báo var $sung = '';

// Tất cả các hàm, phương thức đều kế thừa từ cha

// nên không cần viết lại

}

2) Gọi các phương thức và thuộc tính của lớp cha

Gọi bên trong lớp con

Như khái niệm tính kế thừa, lớp con kế thừa từ lớp cha nên tất cả các phương thức và thuộc tính đều coi như là của nó (coi như chứ không phải là của nó hẳn) nên cách gọi cũng như cách nó gọi các phương thức thuộc tính của nó, đó là từ khóa $this-

>thuoctinh, $this->phuong_thuc().

Tuy nhiên để phân biệt hàm nào của cha, hàm nào của con người ta hay gọi bằng từ khóa: parent::thuoctinh, parent::phuong_thuc().

Ví dụ:

/ Lớp Động Vật class DongVat{

// Thuộc tính var $mat = ''; var $mui = '';

// Phương Thức function an(){

echo 'Dong Vat Dang An';

}

}

// Lớp Con Trâu

class ConTrau extends DongVat

{

function gioi_thieu(){

$this->mat = 'Đây là cái mặt';

$this->mui = 'Đây là cái mũi';

parent::an(); // xuất ra chuỗi "Động Vật Đang Ăn"

}

}

Gọi từ bên ngoài lớp

Cách gọi cũng như cách 1 của phần gọi bên trong lớp con, tuy nhiên không có cách 2 (sử dụng từ parent::thuoctinh, pareng::phuong_thuc()).

Ví dụ:

// Lớp Động Vật class DongVat{

// Thuộc tính var $mat = ''; var $mui = '';

// Phương Thức function an(){

echo 'Dong Vat Dang An';

}

}

// Lớp Con Trâu

class ConTrau extends DongVat{ function gioi_thieu(){

$this->mat = 'Đây là cái mặt';

$this->mui = 'Đây là cái mũi';

parent::an(); // xuất ra chuỗi "Động Vật Đang Ăn"

}

}

// Chương Trình

$contrau = new ConTrau();

// Gọi đến hàm gioi_thieu trong lớp Con Trâu

// nên xuất ra màn hình chuỗi "Động Vật Đang Ăn"

$contrau->gioi_thieu();

// Trong hàm giới thiệu có gán giá trị cho 2

// thuộc tính mắt và mũi, giờ ta xuất ra màn hình

// xem giá trị nó là gì echo $contrau->mat; echo $contrau->mui;

2.11.5. Các mức truy cập private protected và public

Trong tính kế thừa, tất cả các thuộc tính và phương thức của đối tượng cha đều sử dụng được ở đối tượng con. Nhưng thực tế có những thuộc tính và phương thức ở đối tượng cha ta không muốn hàm con truy cập vào, cũng như ở đối tượng con có những thuộc tính và phương thức chỉ muốn sử dụng riêng chứ không được truy xuất tới. Để giải quyết vấn đề này trong lập trình hướng đối tượng sẽ có các mức truy cập private, protected và public.

1) Mức truy cập private

Đây là thành phần dành riêng cho lớp không được truy xuất với bất kỳ một lớp nào khác (lớp kế thừa nó) hoặc ở bên ngoài, nó chỉ dành riêng cho việc xử lý nội bộ.

Mức truy cập private thường được sử dụng với:

- Các thuộc tính dữ liệu nhằm bảo vệ chúng, tránh sự truy cập tự do từ bên ngoài, các thuộc tính này sẽ có những hàm SET và GET để nhập và xuất dữ liệu.

- Các phương thức trung gian tính toán trong nội bộ của đối tượng mà ta không muốn bên ngoài biết đến dòng code của nó.

Ví dụ:Không kế thừa.

// Lớp Xe class Xe{

private $loaixe; function getLoaixe()

{

return $this->loaixe;

}

function setLoaixe($loaixe)

{

$this->loaixe = $loaixe;

}

}

// Khởi tạo một lớp đối tượng xe

$xe = new Xe();

// Gán giá trị cho thuộc tính loại xe

$xe->setLoaixe('Wave S');

// Lấy giá trị thuộc tính loại xe

echo $xe->getLoaixe(); // kết quả xuất ra Wave S

Ở ví dụ trên muốn truy xuất giá trị thuộc tính loaixe thì phải thông qua phương thức setLoaixe và getLoaixe chứ không thể trỏ thẳng trực tiếp đến thuộc tính loaixe vì thuộc tính loaixe đang ở mức private.

Như bài này là sai:

// Lớp Xe class Xe{

private $loaixe; function getLoaixe()

{

return $this->loaixe;

}

function setLoaixe($loaixe)

{

$this->loaixe = $loaixe;

}

}

// Khởi tạo một lớp đối tượng xe

$xe = new Xe();

// Gán giá trị cho thuộc tính loại xe

// nhưng sai tại vì loaixe đang ở mức private

// nên không thể truy xuất bên ngoài

$xe->loaixe = 'Wave S';

// Lấy giá trị thuộc tính loại xe

// cũng sai vì loaixe là private echo $xe->loaixe;

Ví dụ:Có kế thừa

// Lớp Xe class Xe{

private $loaixe; var $tenxe;

function getLoaixe(){ return $this->loaixe;

}

function setLoaixe($loaixe){

$this->loaixe = $loaixe;

}

private function xoaLoaixe(){ echo 'Hàm xóa loại xe';

}

}

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 15/07/2022