.:: CODE SNIPPET ::.

"Your time is limited, so don't waste it living someone else's life"

Sự khác biệt giữa một interface và một abstract class


Cách tốt nhất để trả lời cho câu hỏi này là chúng ta sẽ đi từ định nghĩa ngắn gọn của interface và abstract class, sau đó khám phá sự khác biệt giữa chúng.

Một lớp được khai báo là abstract khi nó có một hoặc nhiều abstract method. Ngược lại, một lớp có một hoặc nhiều abstract method thì phải được khai báo là abstract. Một method được khai báo là là abstract khi nó có một khai báo (method heading) nhưng không có cài đặt bên trong. Để giải thích tại sao bạn muốn khai báo một method là abstract, hãy xem ví dụ sau:

/* the Figure class must be declared as abstract
   because it contains an abstract method  */

public abstract class Figure
{
	/* because this is an abstract method the
	   body will be blank  */
	public abstract float getArea();
}

public class Circle extends Figure
{
	private float radius;

	public float getArea()
	{
		return (3.14 * (radius * 2));
	}
}

public class Rectangle extends Figure
{
	private float length, width;

	public float getArea(Figure other)
	{
		return length * width;
	}
}

Trong ví dụ trên, lớp Figure có một abstract method là getArea(), và bởi vì lớp Figure chứa một abstract method, nên chính nó cũng phải được khai báo là abstract. Lớp Figure có hai lớp dẫn xuất (derived class) là Circle và Rectangle. Cả hai lớp này cung cấp những định nghĩa cho phương thức getArea().
Nhưng câu hỏi thực tế là tại sao chúng ta lại khai báo getArea() là abstract method? Phương thức getArea() làm gì, nó trả về giá trị là diện tích của một hình cụ thể. Nhưng bởi vì lớp Figure không phải là một hình cụ thể, nghĩa là không có một định nghĩa xác định nào cho hàm getArea() trong lớp Figure cả. Đó là lý do mà chúng ta khai báo lớp Figure là abstract. Bất kỳ lớp nào kế thừa từ lớp Figure phải cài đặt cho phương thức getArea() hoặc là khai báo abstract lại chính nó.
Đó là chúng ta đã tìm hiểu các khái niệm abstract method và abstrac class, bây giờ chúng ta sẽ tìm hiểu khái niệm về interface và sự khác biệt với abstract class.
Một interface khác với abstract class vì nó không phải là class. Một interface về cơ bản là một loại mà có thể thõa mãn bởi những lớp thực thi (implement) nó.
Bất kỳ lớp nào thực thi một interface phải thõa mãn hai điều kiện sau:

  • Nó phải có một cụm từ “implements interface_name” ở dòng khai báo lớp.
  • Nó phải thực thi tất cả các khai báo hàm được liệt kê trong đinh nghĩa interafce.

Ví dụ:

public interface Dog
{
	public boolean Barks();

	public boolean isGoldenRetriever();
}

Khi một lớp thực thi interface nó phải như sau:

public class SomeClass implements Dog
{
	public boolean Barks{
	// method definition here

	}

	public boolean isGoldenRetriever{
	// method definition here
	}
}

Bên trên là các khái niệm, bây giờ điểm khác biệt giữa interface và abstract class là gì:
1. Abstract class được hiểu là để được kế thừa từ, và khi một lớp kế thừa từ một lớp khác nghĩa là có một mối quan hệ rõ ràng giữa hai lớp. Ví dụ, nếu chúng ta có một lớp cha abstract tên là “Canine”, bất kỳ lớp dẫn xuất nào thì cũng nên là một con vật nào đó thuộc vào gia đình canine (như Gog hoặc Wolf).
về phía interface, mối liên hệ giữa interface và các lớp thực thi của nó thì không nhất thiết là rõ ràng. Ví dụ, nếu chúng ta có một lớp “House”, lớp đó cũng thực thi (implement) một interface đặt tên là “AirConditioning”. Máy điều hòa không phải là một phần cốt yếu của một ngôi nhà. Và mối quan hệ đó không rõ ràng như mối quan hệ giữa “TownHouse” và lớp “House”. Vì Nhà ở miền quê là một loại nhà, mối liên hệ đó rất là rõ ràng, và nên được định nghĩa bằng sự kế thừa hơn thì hợp lý hơn là interface.
Tóm lại,điểm đầu tiên là abstract class thì thích hợp hơn khi có một mối liên hệ rõ ràng chặt chẽ giữa abstract class và những lớp dẫn xuất của nó. Nhưng, với interface thì không cần một mối liên hệ chặt chẽ giữa interface và lớp thực thi nó.
2.Java không cho đa kế thừa, một lớp chỉ có thể dẫn xuất từ một lớp cho dù nó là abstract hay là không. Tuy nhiên, một lớp có thể implement nhiều interface. Vì thế, một khác biệt quan trọng là các lớp trong Java có thể kế thừa từ chỉ một abstract class, nhưng có thể implement nhiều interface.
3.Một abstract class có thể cung cấp vài hàm cùng với cài đặt. Một interface không thể cung cấp bất kỳ một cài đặt hàm nào, nó chỉ được tạo các khai báo hàm.

Advertisements

4 responses to “Sự khác biệt giữa một interface và một abstract class

  1. LụcTung ThùngRác TìmXác EmYêu January 15, 2014 at 11:03 AM

    Hay thầy ơi, thanks thầy 🙂

  2. terencehao May 24, 2014 at 4:02 PM

    cám ơn bài viết rất hữu ích

  3. Nguyen Phong December 7, 2014 at 4:39 AM

    “Một abstract class có thể cung cấp vài hàm cùng với cài đặt. Một interface không thể cung cấp bất kỳ một cài đặt hàm nào, nó chỉ được tạo các khai báo hàm”

    Câu này nghĩa là gì vậy anh, có thể giải thích kĩ 1 chút được ko vì em chỉ mới học oop với java.
    thank anh!

  4. Minh Trần December 8, 2014 at 6:46 AM

    Hi Nguyen Phong,

    Câu trên có nghĩa là: trong 1 abstract class có thể implement xử lý cho hàm, còn interface thì không.

    abstract class bản chất là class nên có thể implement, còn interface thì không. Ngoại trừ khi sử dụng JDK 8, bạn có thể implement 1 số functions trong interface với từ khóa default.

    interface chỉ cho phép chúng ta định nghĩa các API chuẩn, còn class nào implement nó sẽ cài đặt hàm.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: