9 Lớp – Class

Trong C#, lớp (class) là một cấu trúc cơ bản của lập trình hướng đối tượng, cho phép bạn tạo ra các kiểu dữ liệu tùy chỉnh bằng cách kết hợp dữ liệu (thuộc tính) và các hành vi (phương thức).

Định nghĩa lớp

Để định nghĩa một lớp trong C#, bạn sử dụng từ khóa class theo cú pháp sau:

[phạm_vi_truy_cập] class TênLop
{
    // Các thành viên của lớp
}
  • phạm_vi_truy_cập: Xác định mức độ truy cập của lớp (public, private, protected, internal).
  • TênLop: Tên của lớp, nên đặt theo quy tắc PascalCase.

Ví dụ: Định nghĩa một lớp Rectangle với các thuộc tính và phương thức cơ bản:

public class Rectangle
{
    // Properties
    public double Length { get; set; }
    public double Width { get; set; }

    // Method to calculate area
    public double CalculateArea()
    {
        return Length * Width;
    }
}

Tạo đối tượng từ lớp

Sau khi định nghĩa lớp, bạn có thể tạo các đối tượng (instance) từ lớp đó bằng từ khóa new:

Rectangle rect = new Rectangle();

Bạn cũng có thể khởi tạo đối tượng với các giá trị ban đầu:

Rectangle rect = new Rectangle
{
    Length = 5.0,
    Width = 3.0
};

Sử dụng đối tượng

Sau khi tạo đối tượng, bạn có thể truy cập các thuộc tính và phương thức của nó:

double area = rect.CalculateArea();
Console.WriteLine($"Area of the rectangle: {area}");

Phương thức khởi tạo (Constructor)

Phương thức khởi tạo được gọi khi một đối tượng được tạo ra, dùng để khởi tạo các giá trị ban đầu cho đối tượng.

Ví dụ: Thêm phương thức khởi tạo cho lớp Rectangle:

public class Rectangle
{
    public double Length { get; set; }
    public double Width { get; set; }

    // Constructor
    public Rectangle(double length, double width)
    {
        Length = length;
        Width = width;
    }

    public double CalculateArea()
    {
        return Length * Width;
    }
}

Khi tạo đối tượng, bạn có thể truyền các giá trị ban đầu:

Rectangle rect = new Rectangle(5.0, 3.0);
Console.WriteLine($"Area: {rect.CalculateArea()}");

Khái niệm về từ khóa this

Trong C#, từ khóa this được sử dụng để tham chiếu đến đối tượng hiện tại của lớp trong ngữ cảnh phương thức hoặc Constructor. Nó là một cách để phân biệt các thành viên của lớp (như thuộc tính hoặc phương thức) với các tham số hoặc biến cục bộ trong phương thức hoặc Constructor.

Tính năng chính của từ khóa this

  1. Tham chiếu đến đối tượng hiện tại:
    • this trỏ đến đối tượng của lớp đang được sử dụng.
    • Cho phép bạn truy cập các thuộc tính, phương thức và chỉ số của đối tượng hiện tại.
  2. Làm rõ sự nhầm lẫn giữa thành viên lớp và tham số:
    • Trong trường hợp tham số có cùng tên với thuộc tính của lớp, this được sử dụng để phân biệt.
  3. Gọi Constructor khác trong cùng lớp:
    • Sử dụng this để tránh lặp lại mã nguồn khi có nhiều Constructor.
  4. Truyền đối tượng hiện tại làm tham số:
    • this có thể được sử dụng để truyền đối tượng hiện tại cho một phương thức hoặc Constructor khác.

Cách sử dụng từ khóa this

1. Tham chiếu đến thuộc tính hoặc phương thức của lớp

Khi tham số có cùng tên với thuộc tính của lớp, bạn sử dụng this để phân biệt:

public class Rectangle
{
    private double length;
    private double width;

    public Rectangle(double length, double width)
    {
        // Sử dụng this để phân biệt thuộc tính và tham số
        this.length = length;
        this.width = width;
    }

    public double CalculateArea()
    {
        return this.length * this.width;
    }
}

Giải thích:

  • this.length tham chiếu đến thuộc tính length của lớp.
  • length (không có this) tham chiếu đến tham số của Constructor.

2. Gọi Constructor khác trong cùng lớp

Bạn có thể sử dụng this để gọi một Constructor khác trong cùng lớp. Điều này giúp tránh việc lặp lại mã nguồn khi cần thiết lập giá trị mặc định hoặc xử lý tương tự.

public class Rectangle
{
    public double Length { get; set; }
    public double Width { get; set; }

    // Constructor 1: Gọi Constructor 2 với giá trị mặc định
    public Rectangle()
        : this(1.0, 1.0)
    {
    }

    // Constructor 2: Thiết lập giá trị cụ thể
    public Rectangle(double length, double width)
    {
        this.Length = length;
        this.Width = width;
    }
}

Giải thích:

  • : this(1.0, 1.0) trong Constructor đầu tiên sẽ gọi Constructor thứ hai, giúp tái sử dụng mã nguồn để thiết lập giá trị mặc định.

3. Truyền đối tượng hiện tại làm tham số

Bạn có thể sử dụng this để truyền đối tượng hiện tại cho một phương thức hoặc lớp khác.

public class Rectangle
{
    public double Length { get; set; }
    public double Width { get; set; }

    public void Print(Rectangle rect)
    {
        Console.WriteLine($"Length: {rect.Length}, Width: {rect.Width}");
    }

    public void ShowCurrent()
    {
        // Truyền đối tượng hiện tại
        this.Print(this);
    }
}

Giải thích:

  • Trong phương thức ShowCurrent, từ khóa this được truyền cho phương thức Print để in thông tin của đối tượng hiện tại.

4. Truy cập chỉ mục trong lớp (Indexer)

this được sử dụng trong các lớp có chỉ mục (indexer) để truy cập các phần tử:

public class MyCollection
{
    private int[] data = new int[5];

    public int this[int index]
    {
        get { return data[index]; }
        set { data[index] = value; }
    }
}

Giải thích:

  • this[int index] là một chỉ mục cho phép truy cập các phần tử của mảng data trong đối tượng.

5. Không sử dụng được this trong phương thức tĩnh

this không thể được sử dụng trong các phương thức tĩnh (static) vì phương thức tĩnh không gắn liền với bất kỳ đối tượng cụ thể nào. Chúng thuộc về lớp chứ không thuộc về đối tượng.

public static void StaticMethod()
{
    // Lỗi: Không thể sử dụng 'this' trong phương thức tĩnh
    // Console.WriteLine(this.Length);
}

Ví dụ tổng hợp

Dưới đây là một ví dụ minh họa đầy đủ về cách sử dụng từ khóa this:

using System;

public class Rectangle
{
    private double length;
    private double width;

    // Constructor với tham số
    public Rectangle(double length, double width)
    {
        this.length = length;
        this.width = width;
    }

    // Constructor mặc định
    public Rectangle()
        : this(1.0, 1.0) // Gọi Constructor khác
    {
    }

    // Phương thức tính diện tích
    public double CalculateArea()
    {
        return this.length * this.width;
    }

    // Phương thức hiển thị thông tin
    public void Print()
    {
        Console.WriteLine($"Rectangle [Length: {this.length}, Width: {this.width}, Area: {this.CalculateArea()}]");
    }

    // Truyền đối tượng hiện tại làm tham số
    public void ShowDetails()
    {
        this.Print();
    }
}

class Program
{
    static void Main()
    {
        // Tạo đối tượng với Constructor mặc định
        Rectangle rect1 = new Rectangle();
        rect1.ShowDetails();

        // Tạo đối tượng với giá trị cụ thể
        Rectangle rect2 = new Rectangle(5.0, 3.0);
        rect2.ShowDetails();
    }
}

Output:

Rectangle [Length: 1, Width: 1, Area: 1]
Rectangle [Length: 5, Width: 3, Area: 15]

Hiểu rõ this giúp bạn làm việc với lập trình hướng đối tượng trong C# dễ dàng hơn và tạo ra mã nguồn rõ ràng, dễ bảo trì hơn

Tính đóng gói (Encapsulation)

Tính đóng gói cho phép ẩn giấu thông tin chi tiết của đối tượng, chỉ cung cấp các phương thức cần thiết để tương tác với đối tượng.

Ví dụ: Sử dụng các thuộc tính với phạm vi truy cập phù hợp:

public class Rectangle
{
    private double length;
    private double width;

    public double Length
    {
        get { return length; }
        set { length = value; }
    }

    public double Width
    {
        get { return width; }
        set { width = value; }
    }

    public double CalculateArea()
    {
        return length * width;
    }
}

Việc hiểu và áp dụng đúng các khái niệm về lớp trong C# giúp bạn xây dựng các ứng dụng theo hướng đối tượng một cách hiệu quả và dễ bảo trì.

Để lại một bình luận 0

Your email address will not be published. Required fields are marked *