Thursday, January 11, 2007

Abstract Class vs Interface

1/Abstract:Abstract là 1 công cụ cơ bản của lập trình hướng đối tượng. Nó bổ sung cho chức năng inheritance (kế thừa). Lớp kế thừa được thừa hưởng những đặc tính và chức năng của lớp cha. Khi những đặc tính và chức năng đó của cha chưa được biết trước thì người ta dùng abstraction.Ví dụ:- Định nghĩa con vật thì phải có chân, số chân bi nhiêu thì chưa biết trước.- Con mèo kế thừa từ con vật, vậy con mèo cũng có chân.- Con vịt cũng là con vật, con vịt có chân.
Code:
public class Animal
{
public bool HasLegs
{ get { return true; } }
}
public class Cat: Animal
{
}
public class Duck : Animal
{
}Nhờ kế thừa nên cả Duck lẫn Cat không cần viết dòng code nào vẫn nghiễm nhiên được thừa hưởng thuộc tính HasLegs. Tuy nhiên, con vịt có 2 chân, con mèo có bốn chân. Vậy làm sao mình đếm được số chân của 1 con vật bất kỳ nào đó? Mình sẽ dùng abstraction để sửa lại như sau:
Code:
public class Animal
{
public bool HasLegs
{ get { return true; } }
public abstract int NumberOfLegs
{ get;}
}
public class Cat: Animal
{
public override int NumberOfLegs
{
get { return 4; }
}
}
public class Duck : Animal
{
public override int NumberOfLegs
{
get { return 2; }
}
}Thật tiện lợi, phải không? Nhờ có abstract nên ngay từ lớp cha (Animal) đã có thể định nghĩa được thuộc tính NumberOfLegs mà không biết trước sẽ có bao nhiêu chân cả. Lớp kế thừa (Duck, Cat) sẽ có nhiệm vụ trả lời chuyện này.2/Interface:Interface thực ra chính là abstraction nhưng cao cấp hơn abstract đơn thuần như đã nói ở trên. Interface uyển chuyển hơn abstract rất nhiều do đó nó gần như là lựa chọn số một khi bạn cần thiết kế mô hình có cấu trúc mở.Ví dụ: mình biết con mèo, con vịt có thuộc tính trọng lượng. Mình lại có những vật khác cũng lại có trọng lượng như cái bàn, cái ghế. Rõ ràng 2 nhóm đối tượng này tuy chung thuộc tính nhưng không kế thừa được, cũng không abstract được vì chúng thuộc 2 nhóm khác nhau xa lắc xa lơ. (không lẽ cái bàn lại kế thừa từ con vật?)Do đó, thay vì dùng abstract, mình dùng interface. Ví dụ trên chính là đặc tính multiple-inheritance. (hay nói cho sang hơn, là poly-morphism)Nhưng chức năng đặc sắc nhất của interface lại là ở chỗ "required contract". Ví dụ như Photoshop ấy. Hãng Adobe khi cho ra lò Photoshop thì dành riêng 1 số plug-ins interface để mọi người có thể viết filters cho Photoshop. Bản thân Adobe không hề biết trước khách hàng của mình sẽ cần những gì. Nhờ có plug-ins, những lập trình viên khác, nắm bắt được yêu cầu khách hàng tốt hơn, sẽ viết filters thêm cho Photoshop. Họ cứ việc dựa vào interface sẵn có của Photoshop để viết. Nếu không nhờ interface thì chuyện này sẽ không thể nào xảy ra, muốn có tính năng mới thì bắt buộc phải viết Photoshop lại, bắt buộc phải compile lại.

source: http://www.ddth.com/showthread.htm?t=69503&page=1&pp=15

No comments: