×

Tính kế thừa và đa hình trong lập trình hướng đối tượng C#

Lập trình hướng đối tượng (OOP) là một phương pháp lập trình mạnh mẽ và linh hoạt, trong đó hai tính năng nòng cốt là tính kế thừa và đa hình đóng vai trò rất quan trọng. Ngôn ngữ lập trình C# hỗ trợ đầy đủ các tính năng này, giúp lập trình viên tạo ra mã nguồn dễ đọc, dễ bảo trì và có thể tái sử dụng.

Tính kế thừa

Kế thừa là một khái niệm trong OOP cho phép một lớp (class) con thừa hưởng các thuộc tính (properties) và phương thức (methods) từ một lớp cha (base class). Điều này giúp tiết kiệm thời gian và công sức khi lập trình, đồng thời tăng tính nhất quán của mã nguồn.

Trong C#, để khai báo một lớp con kế thừa từ lớp cha, ta sử dụng cú pháp dấu hai chấm (:) sau tên lớp phụ và trước tên lớp cha:

public class Animal
{
    public void Eat()
    {
        Console.WriteLine("Eating.");
    }
}

public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("Barking.");
    }
}

Trong ví dụ trên, lớp Dog kế thừa từ lớp Animal. Do đó, Dog có thể sử dụng phương thức Eat từ Animal và cũng có thể có phương thức riêng của nó là Bark.

Tính đa hình

Đa hình là khả năng của các đối tượng thuộc những lớp khác nhau có thể được xử lý thông qua cùng một giao diện. Có hai loại đa hình chính: đa hình thời gian biên dịch (compile-time polymorphism) và đa hình thời gian chạy (runtime polymorphism).

Đa hình thời gian biên dịch

C# hỗ trợ đa hình thời gian biên dịch bằng cách sử dụng phương thức quá tải (method overloading) hoặc toán tử quá tải (operator overloading). Quá tải phương thức là việc khai báo cùng tên phương thức nhưng với các tham số khác nhau.

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public double Add(double a, double b)
    {
        return a + b;
    }
}

Trong ví dụ trên, phương thức Add được quá tải để có thể cộng hai giá trị kiểu int hoặc hai giá trị kiểu double.

Đa hình thời gian chạy

Đa hình thời gian chạy trong C# thường được thực hiện thông qua sự kiện ghi đè phương thức (method overriding) hay sử dụng giao diện (interfaces).

Một ví dụ về ghi đè phương thức:

public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal sound");
    }
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}

Ở đây phương thức MakeSound của lớp Animal được khai báo là virtual, và trong lớp Dog, phương thức này được ghi đè (override) để cung cấp hành vi cụ thể cho đối tượng Dog.

Một ví dụ về sử dụng giao diện:

public interface IMovable
{
    void Move();
}

public class Car : IMovable
{
    public void Move()
    {
        Console.WriteLine("Car is moving");
    }
}

public class Person : IMovable
{
    public void Move()
    {
        Console.WriteLine("Person is moving");
    }
}

Trong ví dụ trên, IMovable là một giao diện với phương thức Move. Cả CarPerson đều triển khai giao diện này và cung cấp hành vi cụ thể cho phương thức Move.

Tổng kết

Tính kế thừa và đa hình là hai tính năng cơ bản nhưng vô cùng mạnh mẽ trong lập trình hướng đối tượng C#. Tận dụng tốt các tính năng này giúp cho mã nguồn trở nên dễ quản lý, giảm thiểu sự trùng lặp và tăng khả năng mở rộng của ứng dụng. Qua các ví dụ minh họa, hi vọng rằng lập trình viên có thể nắm rõ hơn về cách áp dụng chúng trong dự án thực tế.

Comments