Bài 1: Giới thiệu về Trình quản lý quảng cáo

Bài Giảng C#: Tính Trừu Tượng (Abstraction)

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

Tính trừu tượng (Abstraction) là một trong bốn tính chất quan trọng của lập trình hướng đối tượng (OOP). Nó giúp ẩn đi các chi tiết triển khai không cần thiết và chỉ hiển thị những gì quan trọng đối với người sử dụng.

Trong C#, tính trừu tượng được thực hiện thông qua lớp trừu tượng (abstract class)phương thức trừu tượng (abstract method).


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

Lớp trừu tượng là một lớp không thể tạo đối tượng trực tiếp, mà chỉ có thể được kế thừa. Nó có thể chứa:

  • Phương thức trừu tượng (chưa có phần thân, bắt buộc lớp con phải triển khai).
  • Phương thức bình thường (đã có phần thân, có thể override hoặc sử dụng luôn).
  • Thuộc tính.
Ví dụ về lớp trừu tượng
using System;

abstract class DongVat
{
    public string Ten { get; set; }

    public DongVat(string ten)
    {
        Ten = ten;
    }

    // Phương thức trừu tượng (không có phần thân)
    public abstract void Keu();

    // Phương thức bình thường
    public void HienThiThongTin()
    {
        Console.WriteLine($"Tên động vật: {Ten}");
    }
}

3. Phương thức trừu tượng (Abstract Method)

  • Một phương thức trừu tượng chỉ có khai báo mà không có phần thân.
  • Lớp con bắt buộc phải override lại phương thức này.
Ví dụ về phương thức trừu tượng
class Cho : DongVat
{
    public Cho(string ten) : base(ten) { }

    // Override phương thức trừu tượng
    public override void Keu()
    {
        Console.WriteLine("Gâu gâu!");
    }
}

class Meo : DongVat
{
    public Meo(string ten) : base(ten) { }

    // Override phương thức trừu tượng
    public override void Keu()
    {
        Console.WriteLine("Meo meo!");
    }
}

4. Sử dụng lớp trừu tượng

class Program
{
    static void Main()
    {
        DongVat cho = new Cho("Cún");
        DongVat meo = new Meo("Mèo");

        cho.HienThiThongTin();
        cho.Keu();

        meo.HienThiThongTin();
        meo.Keu();
    }
}

Kết quả mong đợi

Tên động vật: Cún
Gâu gâu!
Tên động vật: Mèo
Meo meo!

5. Tại sao cần sử dụng tính trừu tượng?

Giúp tổ chức mã nguồn tốt hơn: Tạo một lớp cha chung để dễ dàng mở rộng.
Hạn chế trùng lặp mã nguồn: Chỉ viết một lần trong lớp cha, lớp con chỉ cần kế thừa và triển khai cụ thể.
Bảo mật dữ liệu: Ẩn đi các chi tiết không cần thiết, chỉ cung cấp các phương thức cần thiết.


6. So sánh Abstract Class và Interface

Đặc điểm Abstract Class Interface
Chứa phương thức có thân ✅ Có ❌ Không
Chứa phương thức trừu tượng ✅ Có ✅ Có
Kế thừa nhiều lớp ❌ Không ✅ Có
Chứa thuộc tính ✅ Có ❌ Không
Tạo đối tượng trực tiếp ❌ Không ❌ Không

📌 Ghi nhớ:

  • Nếu muốn có cả phương thức cụ thể và phương thức trừu tượng, dùng abstract class.
  • Nếu chỉ cần khai báo các hành vi chung, không cần triển khai cụ thể, dùng interface.

1. Bài Tập: Quản Lý Phương Tiện Giao Thông (Tính Trừu Tượng)

Yêu cầu:

  1. Tạo một lớp trừu tượng PhuongTien với các thuộc tính chung:
    • string Ten (tên phương tiện)
    • int TocDoToiDa (tốc độ tối đa)
  2. Lớp PhuongTien có:
    • Phương thức trừu tượng void Chay() để các lớp con phải override.
    • Phương thức bình thường void HienThiThongTin() để in ra thông tin phương tiện.
  3. Tạo các lớp con XeMayOto kế thừa từ PhuongTien:
    • XeMay khi chạy hiển thị: "Xe máy đang chạy với tốc độ tối đa X km/h"
    • Oto khi chạy hiển thị: "Ô tô đang chạy với tốc độ tối đa X km/h"
  4. Trong hàm Main(), tạo danh sách các phương tiện và gọi các phương thức tương ứng.

2. Kết Quả Mong Đợi

Phương tiện: Honda, Tốc độ tối đa: 100 km/h
Xe máy Honda đang chạy với tốc độ tối đa 100 km/h.

Phương tiện: Toyota, Tốc độ tối đa: 180 km/h
Ô tô Toyota đang chạy với tốc độ tối đa 180 km/h.

3. Nộp bài