01/10/2018, 17:00
Tại sao cần sử dụng Interface khi đã có Abstract class?
Em hỏi ngu tí ạ. Tại sao cần sử dụng interface. Ngoài cái đa kế thừa ra thì nó có tác dụng gì hơn abstract class đâu ạ. Abstract thì nó thêm phương thức non abstract thôi. Còn nếu chỉ có abstract method thì có khác gì đâu ạ. Em mới tìm hiểu nên hơi mơ hồ, cũng xem nhiều ví dụ rồi nhưng đều không nói rõ được vấn đề. Topic em lập hơi lộn xộn các anh thông cảm.
Bài liên quan
Ví dụ nhé : bạn muốn tạo ra một Sở Thú, bạn nhận thấy chúng có nhiều điểm chung, như có tên, có tiếng “kêu”. Đó là điểm chung của tất cả các loài động vật ==> Tạo một
abstract class Animal
. Tuy nhiên lại có một số loài lại biết bay, một số loài lại biết bơi. Chú ý là ở đặc điểm biết bay hay biết bơi chỉ có ở một số loài, chứ không phải có ở tất cả các loài ==> Ta không thể để thuộc tính bơi hay bay trongabstract class Animal
mà phải tạo ra 2 Interface khác nhau làCan_Fly
vàCan_Swim
rồi xem class nào có thểimplements
từng cái thích hợp.VD:
class Fish extends Animal implements Can_Swim
class Bird extends Animal implements Can_Fly
Phân biệt tác dụng của interface và abstract khác nhau nha bạn.
Interface có tác dụng thêm vào một chức năng ở bất kỳ class nào. Ví dụ như person class sẽ có interface IRun, IEat, ILearn… thường người ta sẽ nói sub class thực hiện interface(chức năng)
Abstract có tác dụng như một lớp cha cho tất cả các lớp con có cùng bản chất. Ví dụ như Animal class sẽ có các property chung, phương thức chung. sub class sẽ kế thừa abstract
Abstract class có chức năng tương tự như interface. Bạn không thể khởi tạo đối tượng được khai báo từ abtract class và interface, và cũng có thể tồn tại 2 loại method khác nhau: có implemetation hoặc không có implementation.
Tuy nhiên, với abstract class, bạn có thể định nghĩa field thuộc kiểu
static
vàfinal
, định nghĩapublic
,protected
vàprivate
. Với interface, tất cả các field đều làpublic
,static
,final
, và tất cả method bạn khai báo (declare) hay định nghĩa (define) (theo default method) đềupublic
.Vậy khi nào sử dụng abstract class, khi nào sử dụng interface?
Bạn có thể sử dụng abstract class nếu thoả một trong các điều kiện sau đây:
public
(protected hoặc private).non-static
hoặcnon-final
. Cách này giúp bạn có thể định nghĩa các method có thể truy cập và thay đổi state của object.Bạn có thể sử dụng interface nếu thoả một trong các điều kiện sau đây:
Comparable
vàCloneable
được hiện thực bởi nhiều class không liên quan.Một ví dụ về abstract class là
AbstractMap
, là 1 class trong Collections Framework. Nó có các subclasses nhưHashMap
,TreeMap
,ConcurrrentHashMap
, cùng có chung nhiều method giống nhau, như:get
,put
,isEmpty
,containsKey
,containsValue
.Một ví dụ về interface là
HashMap
.HashMap
implements từ các interfaceSerializable
,Cloneable
,Map<K, V>
. Bằng các đọc Javadocs của các interface, bạn có thể nhận biết được object củaHashMap
có thể clone, có serializable (chuyển object sang byte stream, chuyển byte stream sang object), và có chức năng của map. InterfaceMap<K, V>
được mở rộng mới nhiều default method nhưmerge
vàforEach
mà các class hiện thực có thể sử dụng mà không cần định nghĩa.Ví dụ về
HashMap
cũng là cách sử dụng abstract class và interface trong một library và framework. ClassHashMap
vừa imlements một số interfaces, vừa thừa kế từ abstract classAbstractMap
https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
implement không phải là kế thừa mà là đính kèm
Abstract class là class, trong khi interface là “tập hợp các thuộc tính”. Hiểu được “kế thừa” và “đính kèm” khác nhau thế nào, bạn sẽ hiểu tại sao lại sinh ra 2 thứ khác nhau.