Tính trừu tượng - Abstract classes and interfaces

1. Tính trừu tượng là gì?

Tính trừu tượng (Abstraction) trong OOP là kỹ thuật ẩn đi các chi tiết triển khai và chỉ hiển thị cho người dùng những chức năng cần thiết. Điều này giúp bạn tập trung vào "cái gì" một đối tượng có thể làm, thay vì "làm như thế nào".

Ví dụ: Khi bạn lái xe, bạn chỉ cần biết cách điều khiển vô lăng, đạp ga/phanh, mà không cần biết chi tiết bên trong động cơ hoạt động như thế nào.


2. Abstract Classes (Lớp trừu tượng)

Định nghĩa:

  • Abstract class là một lớp không thể khởi tạo trực tiếp, chỉ có thể được kế thừa bởi lớp con.
  • Một lớp trừu tượng có thể chứa cả:
    • Phương thức trừu tượng (không có thân hàm, chỉ định nghĩa).
    • Phương thức bình thường (có thân hàm).

Cách sử dụng:

  • Khi bạn muốn cung cấp cơ chế mặc định cho các lớp con, nhưng cũng yêu cầu các lớp con phải triển khai một số phương thức cụ thể.

public abstract class Animal

{

    // Phương thức trừu tượng

    public abstract void Speak(); // Lớp con bắt buộc phải override.

 

    // Phương thức thông thường

    public void Eat()

    {

        Console.WriteLine("Animal is eating...");

    }

}

 

// Lớp kế thừa Abstract Class

public class Dog : Animal

{

    public override void Speak()

    {

        Console.WriteLine("Dog barks: Woof Woof!");

    }

}

Đặc điểm:

  • Không thể tạo đối tượng từ abstract class.
  • Có thể chứa thuộc tính, phương thức tĩnh.

3. Interfaces (Giao diện)

Định nghĩa:

  • Interface là một tập hợp các phương thức, thuộc tính mà các lớp thực thi phải triển khai.
  • Chỉ định nghĩa cái gì cần làm (không cung cấp code triển khai).
  • Một lớp có thể thực thi nhiều interfaces (đa kế thừa).

public interface IAnimal

{

    void Speak(); // Phương thức không có phần thân.

    void Move();

}

 

public class Bird : IAnimal

{

    public void Speak()

    {

        Console.WriteLine("Bird chirps: Tweet Tweet!");

    }

 

    public void Move()

    {

        Console.WriteLine("Bird flies!");

    }

}

Đặc điểm:

  • Tất cả các phương thức mặc định là public.
  • Không chứa code triển khai (trừ khi dùng default implementation - từ C# 8.0 trở đi).
  • Hỗ trợ đa kế thừa (một lớp có thể implement nhiều interfaces).

4. So sánh Abstract Classes và Interfaces

Tiêu chí

Abstract Class

Interface

Kế thừa

Một lớp chỉ kế thừa một abstract class.

Một lớp có thể thực thi nhiều interfaces.

Phương thức

Có thể chứa cả phương thức có thân hàm và trừu tượng.

Chỉ chứa phương thức không có thân hàm (trừ default implementation từ C# 8.0).

Thuộc tính/Tiêu đề

Hỗ trợ thuộc tính, hằng số, phương thức tĩnh.

Không hỗ trợ thuộc tính hoặc phương thức tĩnh (trừ C# 8.0).

Mục đích sử dụng

Khi các lớp con cần chia sẻ code chung.

Khi muốn xác định hành vi mà các lớp phải tuân theo.


5. Khi nào dùng Abstract Class và Interface?

  • Abstract Class:
    • Khi các lớp con cần kế thừa một logic chung.
    • Khi bạn cần một base class với cả phương thức trừu tượng và không trừu tượng.
    • Ví dụ: Hệ thống động vật với logic chung như Eat().
  • Interface:
    • Khi các lớp không liên quan cần chia sẻ hành vi.
    • Khi bạn cần đa kế thừa.
    • Ví dụ: Các đối tượng Bird, Fish, và Plane đều có hành vi Move() nhưng không liên quan logic.

6. Ví dụ kết hợp Abstract Class và Interface

public abstract class Animal

{

    public abstract void Speak();

    public void Eat()

    {

        Console.WriteLine("Animal is eating...");

    }

}

 

public interface ISwimmable

{

    void Swim();

}

 

public class Dolphin : Animal, ISwimmable

{

    public override void Speak()

    {

        Console.WriteLine("Dolphin clicks: Click Click!");

    }

 

    public void Swim()

    {

        Console.WriteLine("Dolphin swims in the ocean!");

    }

}

Kết quả khi chạy:

Dolphin dolphin = new Dolphin();

dolphin.Speak(); // Dolphin clicks: Click Click!

dolphin.Eat();   // Animal is eating...

dolphin.Swim();  // Dolphin swims in the ocean!


7. Bài tập thực hành

Mô tả:
Kết hợp cả Abstract Class và Interface để quản lý một hệ thống.

  1. Tạo abstract class Device với:
    • Phương thức GetDeviceInfo(): Hiển thị thông tin thiết bị.
  2. Tạo interface INetworkConnectable với:
    • Phương thức ConnectToNetwork().
  3. Tạo các lớp kế thừa Device và thực thi INetworkConnectable:
    • SmartPhone.
    • Laptop.
  4. Viết chương trình tạo danh sách thiết bị và thực hiện kết nối mạng.

Tác giả: Bạch Ngọc Toàn

Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.

Lên trên