VieTopikKhoá học
  • Games
  • Cá nhân
Tải app
© 2026 VieTopikChính sách bảo mậtĐiều khoản sử dụngCài appEnglish
  • Trang chủ
  • Học
  • Luyện thi
  • Cẩm nang
  • Games
  • Cá nhân
OOP và thiết kếInterface và composition
Bài 5/12
5 phút

Interface

Bình luận
Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Đặt hàng xong, hệ thống gửi email cho khách. Tháng sau sếp muốn gửi thêm SMS. Nếu code đặt hàng gắn chặt với email thì phải sửa chính code đó. Interface giúp code đặt hàng chỉ cần biết "có ai đó gửi được thông báo", còn gửi bằng gì thì tuỳ.

Khái niệm

📜 Interface: danh sách method và property mà một class phải có, thường không kèm cách làm.

🤝 Implement: class ghi : TênInterface thì cam kết viết đủ mọi thành viên của interface đó, thiếu một cái là lỗi compile.

Ví dụ

var service = new OrderService(new EmailNotifier());
service.Place();

interface INotifier
{
    void Send(string message);
}

class EmailNotifier : INotifier
{
    public void Send(string message) =>
        Console.WriteLine($"Email: {message}");
}

class OrderService
{
    private readonly INotifier _notifier;

    public OrderService(INotifier notifier)
    {
        _notifier = notifier;
    }

    public void Place() =>
        _notifier.Send("Đã đặt hàng");
}
  • interface INotifier chỉ khai báo Send, không có thân. Tên interface bắt đầu bằng chữ I.
  • EmailNotifier : INotifier implement interface, nên phải có method Send và để public.
  • OrderService chỉ biết INotifier, không biết email. Nó nhận notifier qua constructor.
  • readonly: field chỉ gán được lúc khai báo hoặc trong constructor.
  • Không new INotifier() được, nhưng biến kiểu INotifier thì giữ được bất kỳ class nào implement nó.
  • Một class implement được nhiều interface: class Shop : INotifier, IPrinter.

Thử ngay

Chép ví dụ trên vào Program.cs. Thêm class dưới đây vào cuối file, rồi thay hai dòng đầu bằng đoạn gọi mới:

class SmsNotifier : INotifier
{
    public void Send(string message) =>
        Console.WriteLine($"SMS: {message}");
}
new OrderService(new EmailNotifier()).Place();
new OrderService(new SmsNotifier()).Place();

Đoán trước khi chạy: dòng thứ hai in ra gì?

Xem kết quả
Email: Đã đặt hàng
SMS: Đã đặt hàng

Dòng thứ hai là SMS: Đã đặt hàng. OrderService gọi Send của object được truyền vào. Thêm cách gửi mới chỉ cần viết class mới, không sửa OrderService.

Lỗi hay gặp

Implement thiếu thành viên. Class đã ghi : INotifier thì phải viết đủ.

// SAI — lỗi compile: thiếu method Send
class PushNotifier : INotifier
{
}
// ĐÚNG
class PushNotifier : INotifier
{
    public void Send(string message) =>
        Console.WriteLine($"Push: {message}");
}

Tạo object từ interface. Interface không có code để chạy.

// SAI — lỗi compile: không new được interface
INotifier notifier = new INotifier();
// ĐÚNG — new một class implement interface đó
INotifier notifier = new EmailNotifier();

Tóm tắt

  • Interface liệt kê method và property mà class phải có, thường không kèm cách làm.
  • Class : TênInterface phải implement đủ mọi thành viên, để public.
  • Code chỉ phụ thuộc vào interface thì đổi được cách làm mà không phải sửa code đó.
  • Không new được interface. Một class implement được nhiều interface.
  • Từ C# 8, method trong interface có thể kèm thân sẵn (default method), class không bắt buộc viết lại method đó.
Abstract classInterface hay abstract class

Bình luận

Đang tải bình luận…

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt