Abstract & Interface trong C#

Mặc dù đã đọc nhiều về Abstract class và Interface nhưng mình vẫn chưa rõ lắm về mục đích sử dụng của 2 thằng này và khi nào thì nên dùng.
Cả Abstract class và Interface đều là các lớp định nghĩa sẵn các method để các lớp khác kế thừa.
Abstract class : các method có thể chỉ khai báo hoặc có thể định nghĩa method đó – quy định cách thực thi của method để các method lớp dẫn xuất sẽ mặc định thực thi như vậy (diễn tả có vẻ hơi khó hiểu Yell)

 

public abstract class Vehicles
{
    private int noOfWheel;
    private string color;

    public abstract string Engine
    {
        get;
        set;
    }

    public abstract void Accelerator();

}

 

Interface : Khai báo các method chứ không định nghĩa các method đó. Các lớp dẫn xuất từ 1 Interface đều phải định nghĩa đầy đủ các method mà kế thừa từ Interface

 

public interface Vehicles
{
    string Engine
    {
        get;
        set;
    }

    void Accelerator();
}

 

Một interface có thể dẫn xuất từ 1 Interface khác

Sau khi nghiên cứu, mình tiếp tục bổ sung chi tiết về Abstract Class.
Ví dụ mình cần lấy thông tin của nhân viên trong 1 công ty bao gồm : Giám đốc, trưởng phòng, nhân viên, tạp vụ,....Mình sẽ phải tạo ra 1 lớp có đầy đủ các thuộc tính

 

class Employee
{
    private string HoTen;
    private int Tuoi;
    private bool GioiTinh;
    private string ChucVu;

    public void ThucHienCongViec();
}

 

Khi tạo 1 lớp như thế này thì với tất cả mọi người(bao gồm các chức vụ khác nhau) sẽ được đưa vào 1 lớp xử lý, việc xử lý như thế này thì không có gì sai nhưng sẽ hơi lẫn lộn và khó nhìn.
Bây giờ, nhìn vấn đề nhập thông tin nhân viên của 1 công ty theo hướng khác, ta sẽ thấy mọi nhân viên dù ở cấp độ hay chức vụ như thế nào thì đều có những thông tin chung và chức năng giống nhau (làm việc) :
+ Họ tên
+ Tuổi
+ Giới tính
+ Thực hiện công việc()
Chính vì thế ta sẽ đưa các thông tin này vào 1 lớp riêng chỉ để dành lưu trữ thông tin

 

abstract class Person
{
    protected string HoTen;
    protected int Tuoi;
    protected bool GioiTinh;

    public abstract void ThucHienCongViec();
}

 

Hàm ThucHienCongViec() ta chỉ khai báo và để abstract bởi vì đã là 1 nhân viên thì phải làm việc nên phụ thuộc vào vị trí của nhân viên đó ta sẽ định nghĩa ra các công việc cụ thể. Từ khóa abstract ở đây để bắt buộc các lớp dẫn xuất từ lớp Person phải override hàm ThucHienCongViec() và định nghĩa nó

 

public class Director : Person
{
    private string ChucVu;
    public override void ThucHienCongViec()
    {
        // code
    }
}

public class Employee : Person
{
    private string ChucVu;
    public override void ThucHienCongViec()
    {
        // code
    }
}

 

Với cách này, khi ta nhập thông tin của nhân viên hay giám đốc thì trông sẽ rõ ràng hơn rất nhiều và các hàm định nghĩa cũng sẽ tường mình hơn, rất dễ dàng cho những người đi sau kế thừa và phát triển.
Chú ý : Với các hàm có từ khóa "abstract" thì trong các hàm ở lớp dẫn xuất bắt buộc phải có hàm override

Còn với Interface thì chỉ để khai báo các phương thức (ngầm định là abstract mặc dù trong khai báo phương thức không có từ khóa này). Các lớp kế thừa từ các Interface bắt buộc phải khai báo lại đầy đủ các hàm đã khai báo ở trong Interface.

Nguồn : http://dotnet.fibo.us/2009/08/15/abstract-interface-trong-c/