Lập trình hướng đối tượng có 4 đặc điểm cơ bản sau.
public, private và protected:
public: Cho phép truy cập (và thay đổi giá trị) của thuộc tính và phương thức ở mọi phạm vi, có thể hiểu là mang đặc tính cộng đồng.protected: Chỉ cho phép truy cập (hay thay đổi) giá trị của thuộc tính và phương thức ở phạm vi của đối tượng con (hoặc lớp con), có thể hiểu là mang đặc tính dòng họ.private: Chỉ cho phép truy cập (hay thay đổi) giá trị của thuộc tính và phương thức ở phạm vi của đối tượng (hoặc lớp), có thể hiểu là mang đặc tính gia đình.extends. Đối tượng thuộc lớp con sẽ có các thuộc tính và phương thức protected và public của lớp mà nó kế thừa.abstract class và interface để trừu tượng hóa các đối tượng. Ví dụ khi ta tạo một lớp (class) dùng đại diên cho các tài khoản tiền gửi ngân hàng của các khách hàng và đặt tên cho lớp này là BankAccount. Lớp này có hai thuộc tính là $balance và $interest dùng để lưu dữ liệu số tiền dư và lãi suất tiền gửi của tài khoản.Với tính trừu tượng (abstraction) thì toàn bộ sự phức tạp của việc xử lý quá trình gửi tiền và rút tiền sẽ được thực hiện trong 2 phương thức deposit và withdraw. Các lập trình viên không cần phải quan tâm tới sự phức tạp (hay nội dung chi tiết) của việc xử lý các công việc gửi tiền và rút tiền trên mà chỉ cần biết mục đích của từng phương thức là gì.
Với tính trừu tượng thì lập trình viên chỉ cần quan tâm tới mục đích của phương thức deposit là để nạp tiền vào tài khoản. Toàn bộ chi tiết của quy trình xử lý gửi tiền sẽ được thực hiện ở bên trong phương thức deposit.
Abstract Class và InterfaceInterface và Abstract class là 2 khái niệm cơ bản trong lập trình OOP. Nhưng phân lớn mọi người cảm thấy mơ hồ và lẫn lộn 2 khái niệm này. Vậy chúng là gì, khác nhau như nào? Tại sao dùng cái này Interface mà không phải Abstract và ngược lại ??? Bỏ qua tất cả những phần về lý thuyết của việc tạo một abstract class và interface. Bạn không cần quan tâm nhiều đến việc abstract có thể khai báo những gì, hay interface có được phép định nghĩa nội dung phương thức hay không. Điểm cơ bản khi bạn được hỏi về sự khác biệt giữa chúng là gì? Đó chính là mục đích mà chúng được sử dụng: – Abstract class: là một class cha cho tất cả các class có cùng bản chất. Bản chất ở đây được hiểu là kiểu, loại, nhiệm vụ của class. Hai class cùng hiện thực một interfacecó thể hoàn toàn khác nhau về bản chất. Hiểu đơn giản như một thằng con (child class) chỉ có thể là con của một thằng cha, có tính cách giống cha (abstract class) nó. – Interface: là một chức năng mà bạn có thể thêm và bất kì class nào. Từ chức năng ở đây không đồng nghĩa với phương thức (hoặc hàm). Interface có thể bao gồm nhiều hàm/phương thức và tất cả chúng cùng phục vụ cho một chức năng. Vậy, bạn không nên nhầm lẫn khi nói về việc một class được implement hay extend. Nhiều người thường hay đồng nhất là không phân biệt hai từ này, nhưng chính chúng đã nói lên sự khác biệt giữa interface và abstract class. Bạn chỉ có thể thừa kế (extend) từ một class và chỉ có thể hiện thực (implement) các chức năng (interface) cho class của mình.
Cuối cùng, cũng nên liệt kê các điểm khác biệt giữa hai khái niệm này để bạn có thể sử dụng được khi cần thiết. Các điểm khác biệt này có thể khác nhau tùy vào ngôn ngữ mà bạn sử dụng. Vì vậy bạn chỉ cần nhớ các điểm căn bản sau:
| Interface | Abstract class | |
|---|---|---|
| Multiple inheritance | Một class có thể hiện thực nhiều interface.(tạm coi là thừa kế) | Không hỗ trợ đa thừa kế |
| Access Modifiers | Mọi phương thức, property đều mặc định là public. | Có thể xác định modifier. |
| Adding functionality | Mọi phương thức, property của interface cần được hiện thực trong class. | Không cần thiết. |
| Fields and Constants | Không | Có |
Nếu một class
implementsnhiềuinterfacemà cácinterfacecó những phương thức cùng tên thì sẽ không lỗi nếu các phương thức đó truyền vào số lượng biến bằng nhau. Còn nếu các phương thức đó khác số lượng biến truyền vào thì sẽ sinh ra lỗi “Fatal error”.
static. Phân biệt cách dùng từ khoá static::method() với self::method()static.static là phương thức có thể truy cập mà không cần khởi tạo một đối tượng của class.static gắn liền với class hơn là với object (là thành phần khởi tạo classbằng từ khóa new), đây là những phương thức chỉ có một, có địa chỉ xác định và không thay đổi địa chỉ trên vùng nhớ (tĩnh).Việc thực thi hàm
statictrongclasscó thể thực hiện bằng lệnh:static::staticMethod(),self::staticMethod()hoặc$this->staticMethod(), trong đóselfvàstaticlà đại diện củaclass, còn$thislà đại diện củaobject. Trong phương thứcstatickhông thể gọi phương thức hoặc thuộc tínhnon-static. Nhưng phương thứcnon-staticcó thể gọi phương thức hoặc thuộc tínhstatic. Bởi vì có thể hiểu đơn giản như sau:
- Phương thức
staticcó thể gọi ngay cả khi chưa khởi tạoobject, do đó nếu phương thứcstaticgọi đến một phương thứcnon-staticthì khi chưa khởi tạoobject, sẽ không có biến$this(là đại diện củaobject) để gọi đến phương thức ‘non-static`.- Đương nhiên phương thức
non-staticluôn luôn có thể gọi đến phương thứcstaticvì phương thứcstaticđã tồn tại ngay từ khi chạy chương trình, khiobjectchưa được khởi tạo.
static::method() với self::method().Như ở trên chúng ta có nhắc đến từ khóa static::method() với self::method(), chúng đều là đại diện cho class để gọi đến các phương thức và thuộc tính static. Câu hỏi đặt ra là Thế tại sao lại phải có tới 2 từ khóa?. Nếu chỉ đơn thuần như trong nội bộ class thì cả 2 từ khóa trên đều cho ra kết quả giống nhau. Nhưng chúng có thể sẽ khác nhau nếu khi class này extends từ class khác.
Nói tóm lại:
self: đại diện cho class khai báo nó.static: đại diện cho class gọi đến nó.Xem tiếp phần 2 tại đây
Nguồn: Devmaster và internet