Phân biệt Abstract Class và Interface,Extends và Implements


Điểm chung
 của Interface và Abstract class là đều không cho phép tạo Instance, tức là tạo 1 object từ class đó mà phải thông qua các lớp kế thừa. Interface và Abstract class thể hiện cho tính đa hình ( Polymorphism ) trong OOP. 


Interface : Là một Abstract Class chứa các biến( variables ), hằng ( constant ) và phương thức ( method ). Tất cả các khai báo trong Interface đều mặc định là Abstract nên có hay không từ khóa Abstract cũng được  . Đặc điểm của các phương thức trong 1 Interface là chúng được khai báo nhưng không được định nghĩa tức là chỉ có tên chứ không có thân, và chúng luôn phải khai báo Public.
abstract interface taychan // Abstract có hay ko cũng OK
{
final int dodaitay = 50; // Final sử dụng cho khai báo hằng
public void sudungtay(); // Method không được định nghĩa
public void sudungchan();

}

Nói về interface ta có thể hiểu dễ dàng như sau :
-Đối với mỗi sự vật trong cuộc sống, chúng có một số điểm nhìn bề ngoài thì giống nhau, nhưng bản chất bên trong lại hoàn toàn khác nhau.
-Tổng hợp các điểm Nhìn bề ngoài giống nhau này, ta cho ra một Interface

Ví dụ như phương thức Nhảycon người nhảy thì khác mà con mèo nhảy thì khác. Cho nên khi ta sử dụng Interface, ta bắt buộc phải định nghĩa lại method.

-Để sử dụng Interface, ta phải dùng từ khóa Implements [Interface A], dịch đơn giản là là Triển khai, thể hiện cho việc bắt buộc phải định nghĩa method đó.

Abstract Class : Là class chứa cả abstract method ( không có phần thân ) và Instance method ( có phần thân ). Các abstract method được khai báo với từ khóa Abstract, các method này khi sử dụng tại lớp kế thừa sẽ phải được định nghĩa lại.
Nói về abstract class ta có thể hiểu dễ dàng như sau : 
Người cha và đứa con đều có hai hoạt động là Ăn và Học, đứa con kế thừa cha hoạt động Ăn giống hệt cha, nhưng nó lại Học khác biệt thời mà cha Học. Vậy có thể coi Học là 1 abstract method của Class Cha 
Để sử dụng Abstract class ta dùng từ khóa Extends dịch ra là Mở rộng, nhưng mỗi lớp con chỉ có thể extends từ 1 class cha, tuy nhiên có thể implements từ rất rất nhiều interfaces.

=> 1 lớp con chỉ có có thể kế thừa từ 1 lớp cha nhưng có thể nhận đặc điểm giống nhau từ nhiều lớp khác thông qua interfaces
abstract class shout 
{
abstract void ShoutLoud();
void ShoutSoft()
{ }
}

Khi sử dụng
class Animal extends shout implements handMoving ,legMoving
{
void ShoutLoud()
{
System.out.println("An animal shout loudly");
}
}

cheers cheers 
a class extends one class
a class implements interfaces
an interface extends interfaces
an interface cannot implements one interface

Phân biệt Interface và lớp Abstract trong OOP

Interface vs Abstract class in OOP
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();

         

    }

}


 Do được xem là bản thiết kế cho toàn Class, nên ngoài những khai báo Properties hoặc Method bắt buộc thì Abstarct class vẫn có thể chứa thêm các Method đã được triển khai hoặc các biến hằng. Ngược lại thì Interface hoàn toàn không thể làm được điều đó.

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();

         

    }

}


 Toàn bộ những Method và Properties trong Interface không cần khai báo Access modifier vì mặc định là Public. Abstract class thì phải bắt buộc khai báo (Public, Protected) và bắt buộc có từ khóa abstract trong các Method và Properties được khai báo trừu tượng.

1


// Xem ví dụ 2

 Một điểm khác biệt nữa là ở lớp dẫn xuất của Interface class bắt buộc phải thực hiện toàn bộ những Method và Properties đã khai báo, ngược lại lớp dẫn xuất của Abstract class chỉ cần thực hiện những Method và Properties được khai báo trừu tượng (có từ khóa abstract)

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

    ...

     

 }



 Ở PHP, sự phân biệt này càng rõ ràng hơn với từ khóa implement cho Interface vàextend cho Abstract class. Thực vậy, lớp dẫn xuất của Abstract class chỉ là mở rộng (extend) còn Interface thì buộc là thực hiện (implement) tất cả.


Post a Comment

Mới hơn Cũ hơn