Hiện nay mặc dù OOP (Object Oriented Programming) đã rất phổ biến nhưng đa số vẫn còn khá mơ hồ trong việc phân biệt và định nghĩa hai khái niệm lớp Interface và Abstract. Bài viết này chúng ta sẽ tìm hiểu kỹ hơn về khái niệm và sự khác biệt giữa chúng, lưu ý ở đây là Abstract Class chứ không phải là Abstract Method nhé!
What is an Abstract Class?
Lớp trừu tượng đơn giản được xem như một class cha cho tất cả các Class có cùng bản chất. Do đó mỗi lớp dẫn xuất (lớp con) chỉ có thể kế thừa từ một lớp trừu tượng. Bên cạnh đó nó không cho phép tạo instance, nghĩa là sẽ không thể tạo được các đối tượng thuộc lớp đó.
What is an Interface?
Lớp này được xem như một mặt nạ cho tất cả các Class cùng cách thức hoạt động nhưng có thể khác nhau về bản chất. Từ đó lớp dẫn xuất có thể kế thừa từ nhiều lớp Interface để bổ sung đầy đủ cách thức hoạt động của mình (đa kế thừa - Multiple inheritance).
Ví dụ:
- Abstract class ConVat có các lớp con Chim, Ca.
- Abstract class MayMoc có các lớp con MayBay, Thuyen
- Interface: iBay, iBoi, iChay.
=> MayBay, Chim sẽ có cùng Interface là iBay. Rõ ràng mặc dù MayBay, Chim có cùng cách thức hoạt động là bay nhưng chúng khác nhau về bản chất.
=> MayBay cũng có interface là iChay nhưng Chim không thể nào kế thừa thêm abstract classMayMoc
Abstract Class vs Interface
Nhìn chung cả 2 đều là "bản thiết kế" cho các lớp dẫn xuất, do đó chúng chỉ chứa các khai báo Properties và Method mà không quan tâm bên trong thực hiện những gì. Nhưng cụ thể thì Abstract Class là "bản thiết kế" cho Class còn Interface là "bản thiết kế" cho Method.
(Ở đây s dùng C# làm ngôn ngữ cho ví dụ)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| //** Ví dụ 1 //** Abstract class public abstract class Employee { //Khai báo Properties public abstract String ID { get ; set ; } //Khai báo Method public abstract String Add(); public abstract String Update(); } } //** Interface public interface IEmployee { //Khai báo Properties String ID { get ; set ; } //Khai báo Method String Add(); String Update(); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| //** Ví dụ 2 //** Abstract class public abstract class Employee { //Khai báo biến hằng (field and constant) public String id; public String name; //Khai báo Properties public abstract String ID { get ; set ; } //Khai báo Method protected abstract String Add(); //Method đã triển khai không dùng abstract public String Update() { return "Update" ; } } } //** Interface public interface IEmployee { //Khai báo Properties String ID { get ; set ; } //Khai báo Method String Add(); String Update(); } } |
1
| // Xem ví dụ 2 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| //** Sử dụng Abstract class và Interface ở ví dụ 2 //** Lớp dẫn xuất Abstract class public class Employee1 : Employee { //Không cần khai báo lại biến hằng. //Triển khai Properties với từ khóa override public override String ID { get { return id; } set { id = value; } } //Triển khai Method với access modifier như ở Abstract class. protected override String Add() { return "Add" ; } //Không cần triển khai lại Update() mà chỉ việc sử dụng. // Phần triển khai của Employee1 ... } //** Lớp dẫn xuất Interface public class Employee1 : IEmployee { // Biến hằng được định nghĩa ở đây. protected String id; protected String name; // Triển khai Properties String ID { get { return id; } set { id = value; } } //Triển khai tất cả các Method có ở Interface public String Add() { return "Add" ; } public String Update() { return "Update" ; } // Phần triển khai của Employee1 ... } |
Không có nhận xét nào:
Đăng nhận xét