Interface & Abstract class !

     Thường khi mới tiếp xúc với Interface và Abstract Class sẽ có nhiều câu hỏi hoàn toàn không ngớ ngẩn rằng "Dùng Interface để làm gì? Trong khi chỉ thừa kế được mỗi cái tên Method!".

     Nói kế thừa thì chính xác chỉ có Abstract mới là kế thừa thực sự, Interface là Implement, not Inherit. Trong Abstract, chúng ta xây dựng nên lớp Base với đầy đủ các thành phần của một Class, bao gồm các Property, Method, riêng các Method Abstract thì là No Body ! Cái No Body này giống với Interface, Interface chỉ gồm tên của các Method, nó hoàn toàn No Body, không có gì cả. 

Ví dụ :
interface IGeometry
    {
        bool IsEmpty();
        bool Overlaps(Geometry geom);
        Geometry Boundary();
    }

 abstract class Geometry : IGeometry 
    {
        protected string _Id;
        public virtual string GetId()
       {
          return _Id;
       } 
        public virtual bool Overlaps(Geometry geom) 
        {
            return SharpMap.Geometries.SpatialRelations.Overlaps(this, geom); 
        }
        public abstract bool IsEmpty();
        public abstract Geometry Boundary();
    }

      Trong ví dụ trên, IGeometry là một Interface bao gồm 3 prototype – không được định nghĩa thân hàm. Geometry là một Abstract Class  kế thừa luôn  IGeometry Interface. Geometry  có một property kiểu string là _Id, một hàm trả về kiểu string là GetId để trả về giá trị _Id, các thành phần này được thiết kế dùng cho việc kế thừa sau này của các lớp khác. Đồng thời, Geometry bắt buộc chứa 3 hàm đã được mô tả trong IGeometry Interface là Overlap, IsEmpty và Boundary. 
      Điều gì làm nên đặc trưng của một Abstract Class, đó chính là 3 hàm abstract không được định nghĩa thân hàm. Các hàm này sẽ được định nghĩa trong các lớp dẫn xuất có  kế thừa  từ Geometry. Lại thêm một câu hỏi nữa, việc định nghĩa các hàm Abstract có bị bắt buộc trong lớp dẫn xuất không, xin thưa rằng bắt buộc! 

      Nhìn một cách nào đó, bạn có thể thấy rằng, Interface giống như những câu lạc bộ, và Abstract class là một ông bố trong gia đình. 
       Một câu lạc bộ luôn luôn có một bộ quy tắc hay nôi qui mà mọi thành viên luôn phải tuân theo. Một ông bố trong gia đình thì khác, ông có tài sản mà con cháu có thể kế thừa, ông cũng có những qui định trong di chúc – ai là người được kế thừa tài sản của ông! 

       Bạn có thể tham gia cùng lúc nhiều câu lạc bộ như việc một Class "kế thừa" (Implement) nhiều Interface. Một khi đã tham gia vào CLB nào, bạn phải tuân thủ tất cả các qui tắc của CLB đó, không quan tâm bạn là thành viên của bao nhiêu CLB. Đó là việc tại sao phải Implement đầy đủ các Interface member.
      CLB không để lại tài sản cho các bạn, nhưng bố của bạn thì có, ông ấy cho bạn tài sản (không nếu ông ấy không thích :d) và cũng bắt bạn tuân theo các qui tắc – gia qui. Và một khi đã là con của người này thì bạn không thể nào là con của người khác giống như không thể kế thừa từ nhiều Abstract Class!
   
    Chú ý, đôi khi bạn không thực hiện vài qui định nào đó (có người yêu chẳng hạn), hãy nói với bố bạn, ông ấy sẽ đồng ý! C# cũng thế,lời xin phép là : throw new NotImplementedException();
      

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s